[英]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.