对象上出现意外的“arguments”属性

时间:2013-03-26 14:12:18

标签: javascript

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

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');

根据我的评论,检查arguments上的this属性会显示null,同时记录this.arguments会明确显示["my", "arguments"]

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

2 个答案:

答案 0 :(得分:5)

MDN says

  

arguments作为Function的属性无法再使用。

因此我根本不会尝试使用this.arguments,而是使用本地函数变量arguments。很明显,创建arguments也有一些神奇之处。

答案 1 :(得分:5)

  

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

this keyword确实指的是test函数 - 这就是你called的含义。您可以通过记录this === test

来断言 那么arguments属性是什么?在函数调用期间设置为实际very deprecated onearguments object(之后删除,这似乎是console.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
}