6

在下文中,第二个和第三个控制台输出似乎相互矛盾:

function test() {

    console.log(arguments); // -> ["my", "arguments"]

    console.dir(this); // -> test function with arguments property set to null

    console.log(this.arguments); // -> ["my", "arguments"]

}

test.call(test, 'my', 'arguments');

根据我的评论,检查 show 上的属性arguments,同时明确记录 show 。thisnullthis.arguments["my", "arguments"]

this当您以这种方式调用函数时,究竟是什么?我没想到this.arguments会包含调用参数!

4

2 回答 2

5

当您以这种方式调用函数时,这到底是什么?我没想到 this.arguments 包含调用参数!

this关键字确实指的是函数test- 这就是您call编辑它的内容。您可以通过记录来断言this === test

那么这个arguments属性是什么?在函数调用期间设置为实际对象的一个​​非常不推荐使用的对象(此后被删除,这似乎是没有正确捕获它的原因)。不要使用它,也不在乎它:-)argumentsconsole.dir

function test() {
    console.assert(this === test);
    console.assert(this.arguments === arguments);
    console.log(Object.getOwnPropertyDescriptor(this, "arguments"));
}
test.call(test, 'my', 'arguments');

// result (in Opera):
Object {
    configurable: false,
    enumerable: false,
    value: Arguments {
        0: "my",
        1: "arguments",
        callee: Function {…},
        length: 2
    },
    writable: false
}
于 2013-03-26T14:22:00.033 回答
5

MDN 说

arguments作为 的属性Function不能再使用。

因此我根本不会尝试使用this.arguments,而是使用局部函数变量arguments。很明显,还有一些魔法正在创造arguments

于 2013-03-26T14:21:03.763 回答