2
function MyArray() {
    var self = this.arguments; //<---
    this.toString = function() {
        return self;
    };

}

var c = new MyArray(2, 3, 1, '232');
console.log(c.toString());

未定義

function MyArray() {
    var self = arguments; //<---
    this.toString = function() {
        return self;
    };

}

var c = new MyArray(2, 3, 1, '232');
console.log(c.toString());

[2,3,1、 '232']

それで、なぜそうなのですか?this.argumentsargumentsの違いは何ですか?

4

2 に答える 2

2

JSでは、this「呼び出しコンテキスト」を表します。これは、さまざまな方法で設定できます。可変スコープとは実際には何の関係もありません。それらは完全に別個の概念です。そのためarguments、は変数として使用できますが、のプロパティとしては使用できませんthis

の値はthis、関数の呼び出し方法によって異なります。


メソッドとして呼び出されます

たとえば、私がそうするなら...

my_obj.myMethod();

...次に、関数が。のコンテキストから呼び出されたためthisに参照します。my_objmyMethodmy_obj


関数として独立して呼び出されます

しかし、私がそうするなら...

var m = my_obj.myMethod;
m();

my_objmyMethodは最初の例と同じコードですが、この値は通常、オブジェクトに変更されますglobal


.callまたはを使用して呼び出されます.apply

他にもいくつかの方法thisで設定できます。

m.call(my_other_obj, "more", "args");

m.apply(my_other_obj, ["more", "args"]);

.callまたはを使用する.applyと、渡された最初の引数がの値になりますthis。2つの違いは、残りの引数がどのように渡されるかです。


を使用して作成.bind

.bind()と同じ方法で引数を取るが、値と他の引数が永続的に設定された.call()新しい関数を作成して返すものもあります。this


new演算子を使用して呼び出されます

最後の方法は、関数をコンストラクターとして呼び出す場合です。これを行うには、new演算子を使用します。

var new_obj = new m;

var new_obj = new obj.m;

どちらの場合も、の値はthis作成中の新しいオブジェクトになります。new呼び出された関数がコンストラクターとして使用されるように設定されていない限り、YOuは使用しないでください。

于 2012-07-01T20:27:38.380 に答える
1

ありませんthis.arguments。ただしarguments、これは配列のようなオブジェクトであり、常に関数内に存在し、呼び出しで指定された引数を参照します。

于 2012-07-01T19:56:17.857 に答える