6

以下では、2番目と3番目のコンソール出力が矛盾しているようです。

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

私のコメントによると、 showsのargumentsプロパティを調べると、loggingは明示的にを示します。thisnullthis.arguments["my", "arguments"]

thisこのような方法で関数を呼び出すと、正確には何ですか?this.arguments呼び出し引数が含まれるとは思っていませんでした。

4

2 に答える 2

5

MDNによると

argumentsのプロパティとしてはFunction使用できなくなりました。

したがって、私はまったく使用しようとはしませんthis.argumentsが、ローカル関数変数を使用しますargumentsargumentsいくつかの魔法が同様に作成されていることは非常に明白です。

于 2013-03-26T14:21:03.763 に答える
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 に答える