簡體   English   中英

JavaScript`arguments`是否包含`this`?

[英]Does JavaScript `arguments` contain `this`?

我試圖理解函數中JavaScript的arguments隱式變量。 一些教程刪除了它的第0個元素,並說它包含this元素,但另一些教程卻沒有刪除第0個元素。 我很困惑

我寫了這個代碼示例,它顯示arguments不包含this

function aaa () {
    console.log(arguments[0])
}

aaa(1,2,3);

有時arguments可能包含this嗎? 我不知道為什么有些教程在使用arguments之前將第0個元素切掉。

最有可能您具有blah(x)類的函數,在這種情況下,您將第一個參數移除,因為它已被捕獲為變量x ,並且您希望其余的參數已傳入。

第一個論點不是this

參數是傳遞給函數的原始參數的數組*,與“ this”變量沒有直接關系。

也就是說,不同的教程可能會嘗試使用函數的作用域(作用域=>“ this”變量)來解釋函數引用的工作方式等。 這很容易涉及傳遞數組並移出第一個參數。

考慮以下簡單代碼段:

var sample = function(a,b,c){ 
    console.log(arguments, this); 
}; 
sample(1,2,3);

輸出:

[1、2、3],窗口

眾所周知,“ this”是一個特殊的變量,與函數的范圍有關。 很多文章描述了它的作用/如何工作,但是在這種情況下,您可能已經看到了以.call或.apply方式使用的事物:

sample.call(sample, 1, 2, 3)

要么

sample.apply(sample, [1,2,3])

這些代碼片段都做同樣的事情-它們將函數的“ this”范圍從窗口對象(因為“ sample”被聲明為全局函數)轉換為“ sample”函數本身,並傳遞參數1、2和3.他們輸出:

[1,2,3],[采樣功能]

在這種情況下,某些教程會偏離第一個參數的原因是,通常在更改范圍時會使用“幫助程序”函數,使其變得更加明顯,並且許多時候,這些幫助程序函數將第一個參數視為第一個參數。新功能將被執行。 因此,它們移出第一個參數,並在(基本上)調用apply時使用該參數。 一個常見的示例是bind(),如下所示:

Function.prototype.bind = function(scope){
    var me = this,
        args = Array.prototype.slice.apply(arguments, [1]);

        return function () {
            var handlerArgs = []; 
            for (i = 0; i < args.length; i++) {
                handlerArgs.push(args[i]);
            }
            for (var i = 0; i < arguments.length; i++) {
                handlerArgs.push(arguments[i]);
            }
            me.apply(scope, handlerArgs);
        };
};

現在,您可以致電:

var bound = sample.bind(sample, 1);
bound(2,3);

...並獲得輸出:

[1,2,3] [采樣功能]

您可以看到,當我們最初綁定函數時,我們正在傳遞一些參數(范圍和第一個參數),這時我們將第一個參數(“樣本”)切掉,因為那是“范圍”,必須以不同的方式處理(比其他任何參數都大),然后在調用bound()時,將1、2和3推入最終參數列表。

起初有點令人困惑,但希望能有所幫助。

*技術上類似數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM