JavaScript“arguments”是否包含“this”

Does JavaScript `arguments` contain `this`?

本文关键字:this 包含 是否 JavaScript arguments      更新时间:2023-09-26

我正在尝试理解函数中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

Arguments是传递到函数中的原始参数的数组*,与"this"变量没有直接关系。

也就是说,不同的教程可能会尝试使用函数的scope(scope=>"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],[样本函数]

在这种情况下,一些教程会放弃第一个参数的原因是,当范围发生变化时,通常会有"helper"函数使其更加明显,而且这些helper函数很多时候都将执行新函数的范围作为第一个参数。因此,他们去掉了第一个参数,并在(本质上)调用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][sample function]

您可以看到,当我们最初绑定函数时,我们正在传递一些参数(scope和第一个参数),在这一点上,我们将第一个参数("sample",因为这是"scope",必须与任何其他参数不同地处理)切片,然后,当调用bound()时,将1以及2和3推入最终参数列表。

一开始有点令人困惑,但希望这能有所帮助。

*技术上类似数组。