JavaScript`参数`是否包含`this`?

时间:2015-10-28 01:27:02

标签: javascript arguments

我试图了解JavaScript函数中的arguments隐式变量。有些教程会删除它的第0个元素,并说它包含this,但其他一些教程不会删除第0个元素。我很困惑。

我编写了此代码示例,它显示arguments不包含this

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

aaa(1,2,3);

有时候arguments是否包含this?我想知道为什么有些教程会在使用arguments之前切掉第0个元素。

2 个答案:

答案 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