【问题标题】:Does JavaScript `arguments` contain `this`?JavaScript `arguments` 是否包含 `this`?
【发布时间】:2015-10-28 01:27:01
【问题描述】:

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

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

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

aaa(1,2,3);

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

【问题讨论】:

  • 这可能只是“停止@#!&*$% 从'教程'学习编程”的情况
  • 提供该教程的链接。他们可能出于其他原因这样做。 arguments 不包含 this
  • arguments[0] 保存第一个形参的值。
  • 也许你的意思是你见过var args = Array.prototype.slice.call(arguments); ? ...这是从参数创建数组的常用方法
  • 那里没有关系。他们可能只是意味着他们想调用其他函数并将第一个参数用作该函数的this 值。 some_fun.apply(first_arg, rest_of_the_args)

标签: javascript arguments


【解决方案1】:

很可能你有一个像blah(x) 这样的函数,在这种情况下你去掉第一个参数,因为它已经被捕获为变量x,并且你想要已经传入的其余参数。

第一个参数不是this

【讨论】:

    【解决方案2】:

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

    也就是说,不同的教程可能会尝试使用函数的作用域(作用域 =>“this”变量)来解释函数引用的工作原理等。这可能很容易涉及传递一个数组并转移第一个参数。

    考虑这个简单的 sn-p:

    var sample = function(a,b,c){ 
        console.log(arguments, this); 
    }; 
    sample(1,2,3);
    

    输出:

    [1, 2, 3], 窗口

    正如我们现在所知,“this”是一个与函数范围有关的特殊变量。 plenty of articles 描述了它的作用/工作方式,但具体而言,在这种情况下,您可能已经看到以 .call 或 .apply 的方式使用的东西:

    sample.call(sample, 1, 2, 3)
    

    sample.apply(sample, [1,2,3])
    

    这些 sn-ps 都做同样的事情——它们将函数的“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] [样本函数]

    你可以看到我们在最初绑定函数时传递了一些参数(范围和第一个参数),此时我们切掉了第一个参数(“sample”,因为那是“范围”并且必须处理方式与任何其他参数不同),然后在调用 bound() 时,将 1 以及 2 和 3 推送到最终参数列表中。

    一开始有点混乱,但希望能有所帮助。

    *技术上array-like.

    【讨论】:

    • 参数不是数组
    • 好的,很好,它类似于数组。就本次讨论而言,它已经足够接近了:)
    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2012-11-11
    • 2022-01-20
    • 2021-01-13
    相关资源
    最近更新 更多