麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

Javascript學習筆記之函數篇(四):arguments 對象

2019-11-20 13:53:39
字體:
來源:轉載
供稿:網友

每一個 Javascript 函數都能在自己作用域內訪問一個特殊的變量 - arguments。這個變量含有一個傳遞給函數的所有參數的列表。
arguments 對象不是一個數組。盡管在語法上它跟數組有相同的地方,例如它擁有 length 屬性。但它并不是從 Array.prototype 繼承而來,實際上,它就是一個對象。
因此,我們不能直接對 arguments 使用一些數組的方法,例如 push, pop 或 slice 等。 所以為了使用這些方法,我們就需要將其轉換為一個真正的數組。

轉化為數組

下面的代碼將會返回一個包含 arguments 對象所有元素的數組。

Array.prototype.slice.call(arguments);
由于轉化的速度很慢,所以在性能要求嚴格的程序中不建議這樣做。

傳遞參數

下面是一種比較推薦的方法,將 arguments 對象從一個函數傳遞到另一個函數。

復制代碼 代碼如下:

function foo() {
    bar.apply(null, arguments);
}
function bar(a, b, c) {
    // do stuff here
}

另外還有一個比較巧妙的方法,就是同時使用 call 和 apply 快速創建一個解綁的外層方法。

復制代碼 代碼如下:

function Foo() {}
Foo.prototype.method = function(a, b, c) {
    console.log(this, a, b, c);
};
// Create an unbound version of "method"
// It takes the parameters: this, arg1, arg2...argN
Foo.method = function() {
    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
};

函數形參和 arguments 屬性的關系

arguments 對象為它自身屬性和函數的形參都創建了 getter 和 setter 方法。
因此,修改函數的形參會影響對應的 arguments 對象的屬性值,反之亦然。

復制代碼 代碼如下:

function foo(a, b, c) {
    arguments[0] = 2;
    a; // 2
    b = 4;
    arguments[1]; // 4
    var d = c;
    d = 9;
    c; // 3
}
foo(1, 2, 3);

性能問題

arguments 只在兩種情況下不會被創建,一是在函數內部被聲明為局部變量,二是當做函數的形參。其他情況,arguments 對象總是會被創建。
由于 getter 和 setter 方法總是會隨著 arguments 對象的創建而創建,因此使用 arguments 對性能本身幾乎沒有影響。
然而,有一種情形會嚴重影響 Javascript 的性能,那就是使用 arguments.callee。

復制代碼 代碼如下:

function foo() {
    arguments.callee; // do something with this function object
    arguments.callee.caller; // and the calling function object
}
function bigLoop() {
    for(var i = 0; i < 100000; i++) {
        foo(); // Would normally be inlined...
    }
}

在上述代碼中,foo 函數不再是一個簡單的內聯擴展,因為它需要知道它自身以及它的調用者(caller)。這不僅抵消了內聯擴展所帶來的性能提升,同時也破壞了函數的封裝性,因為函數本身可能需要依賴于一個特定的調用背景。
因此,建議大家盡量不要使用 arguments.callee。

以上就是關于Javascript arguments 對象的全部內容了,小伙伴們是否了解透徹呢,簡單的說

arguments指函數的參數對象(指實際傳入的參數)
arguments.length指函數的參數對象的長度
arguments[i]指第i個參數的值(第一個為0)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蜜桃网站在线观看 | 色中色在线播放 | 欧美在线一级 | 成人一区二区在线观看视频 | 成人在线视频一区 | 中文字幕在线播放一区 | 国产一区二区精品在线观看 | 日本免费不卡一区二区 | 在线观看免费视频麻豆 | 国产一级不卡毛片 | 看毛片电影 | 日本黄色大片免费 | 羞羞视频一区二区 | 18视频在线观看娇喘 | 久久精品视频2 | 日韩黄在线观看 | 麻豆视频国产在线观看 | 国产91九色在线播放 | 欧美巨根 | 欧美日韩大片在线观看 | 欧美视频99| 亚洲视频成人在线 | 国产精品成人一区二区三区电影毛片 | 偿还电影免费看 | 中文字幕在线播放一区 | 国产一区二区不卡视频 | 久久精品小短片 | 狠狠操视频网站 | 国产精品白嫩白嫩大学美女 | 国产一区二区在线观看视频 | 久久久aa| 91精品国产91久久久 | 免费看成年人网站 | 女人裸体让男人桶全过程 | 久久久久久久久91 | 在线成人亚洲 | 精品一区二区电影 | 黄色一级片在线免费观看 | 日本精品免费观看 | 成人啪啪色婷婷久 | 中国成人在线视频 |