我正在尝试理解函数中JavaScript的arguments隐式变量。有些教程删除它的第0元素,并说它包含this,但其他一些教程不删除第0元素。我很困惑。
我编写了这个代码示例,它显示了arguments不包含this
function aaa () {
console.log(arguments[0])
}
aaa(1,2,3);有时arguments可能包含this吗?我想知道为什么有些教程在使用arguments之前将第0元素分割开。
发布于 2015-10-28 01:53:08
参数是传递给函数的原始参数的数组*,与"this“变量没有直接关系。
也就是说,不同的教程可能试图使用函数的作用域(作用域=> "this“变量)来解释函数引用是如何工作的等等。这很容易涉及到传递数组和移除第一个参数。
考虑一下下面这个简单的片段:
var sample = function(a,b,c){
console.log(arguments, this);
};
sample(1,2,3);产出:
1,2,3,窗口
正如我们现在所知道的,“这个”是一个特殊的变量,它与函数的范围有关。有一些大量的文章描述了它所做的/如何工作的,但是在这个上下文中,您可能已经看到了.call或.apply使用的一些东西:
sample.call(sample, 1, 2, 3)或
sample.apply(sample, [1,2,3])这些代码片段都执行相同的操作--它们将函数的"this“范围从窗口对象(因为"sample”声明为全局函数)转换为"sample“函数本身,并传递参数1、2和3。
1,2,3,样本函数
在这个上下文中,一些教程将移除第一个参数的原因是,当作用域被更改时,经常会有“助手”函数使其更加明显,而且这些帮助函数多次将执行新函数的范围作为它们的第一个参数。因此,它们移除第一个参数,并在(实质上)调用应用时使用该参数。一个常见的示例是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);...and获得输出:
1,2,3
您可以看到,在最初绑定函数时,我们传递一些参数(作用域和第一个参数),此时我们将第一个参数("sample",因为这是“范围”,必须处理与任何其他参数不同),然后在调用bind ()时,将1以及2和3按到最终参数列表中。
一开始有点让人困惑,但希望这能帮上一点忙。
*技术上是阵列状。
发布于 2015-10-28 01:34:58
很可能您有一个类似于blah(x)的函数,在这种情况下,您可以去掉第一个参数,因为它已经被捕获为变量x,并且您需要传递的其余参数。
第一个参数不是this。
https://stackoverflow.com/questions/33381377
复制相似问题