我试图了解JavaScript函数中的arguments
隐式变量。有些教程会删除它的第0个元素,并说它包含this
,但其他一些教程不会删除第0个元素。我很困惑。
我编写了此代码示例,它显示arguments
不包含this
:
function aaa () {
console.log(arguments[0])
}
aaa(1,2,3);
有时候arguments
是否包含this
?我想知道为什么有些教程会在使用arguments
之前切掉第0个元素。
答案 0 :(得分:3)
很可能你有一个像blah(x)
这样的函数在这种情况下,你取消了第一个参数,因为它已经被捕获为变量x
,你想要传递的其余参数英寸
第一个参数不是this
。
答案 1 :(得分:1)
参数是传递给函数的原始参数的数组*,并不直接与"这个"变量
也就是说,不同的教程可能会尝试使用函数的范围(scope =>" this"变量)来解释函数引用是如何工作的。这可能很容易涉及传递数组并移出第一个参数。
考虑这个简单的片段:
var sample = function(a,b,c){
console.log(arguments, this);
};
sample(1,2,3);
输出:
[1,2,3],窗口
正如我们现在所知,"这"是一个特殊的变量,它与函数的范围有关。有plenty of articles描述它的作用/它是如何工作的,但在这种情况下,你可能会看到以.call或.apply的方式使用的东西:
sample.call(sample, 1, 2, 3)
或
sample.apply(sample, [1,2,3])
这些片段都做同样的事情 - 他们转换了"这个"窗体对象的函数范围(因为"样本"被声明为全局函数)到"样本"函数本身,并传递参数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] [样本函数]
当我们最初绑定函数时,你可以看到我们传递了一些参数(范围和第一个参数),此时我们切掉第一个参数(&#34; sample&#34;,因为那个& #39;范围&#34;并且必须以不同于任何其他参数的方式处理),然后,当调用bound()时,将1以及2和3推入最终参数列表。
一开始有点令人困惑,但希望这有点帮助。
*技术上array-like。