-1

この例を見てみましょう:

var x = 3;

var obj = {
  x:2,
  test: function(){
    var x = 1;
    console.log(this.x);
  } 
};

そして、この関数を呼び出すにはさまざまな方法があります。

obj.test(); // line 1

obj.test.call(null); // line 2

(obj.test)(); // line 3

(obj.test = obj.test)(); // line 4

(obj.test || obj.test)(); // line 5

(obj.test && obj.test)(); // line 6

(obj.test, obj.test)(); // line 7

最初の 3 行は理解できますが、さらに何が起こっているのか説明してもらえますか (4 行目から 7 行目)。それは紛らわしいです。

4

1 に答える 1

1

いずれの場合も 4 から 7 までは、コンテキストではなく関数のみを返します。したがって、オブジェクトから関数を取得すると、そのコンテキストが失われます。次に、関数を呼び出そうとします。その関数thisはグローバルオブジェクトを参照します。これはウィンドウでありx、ウィンドウは 3 です。したがって、use strictモードでは次のようになります。 null、他のモードではウィンドウになります。

4)右側の値を左側の値に代入して返す

(obj.test = obj.test)()

5)最初のオペランドが true の場合はそれを返し、そうでない場合は 2 番目のオペランドを返します

obj.test || obj.test

6)第 1 オペランドと第 2 オペランドが true の場合は第 1 オペランドを返し、そうでない場合は第 2 オペランドを返します。

obj.test && obj.test

7)この場合、2 番目のオブジェクトのみが返されます。,コンマはオブジェクトを互いに区切るだけです

(obj.test, obj.test)()
于 2016-10-26T11:07:51.063 に答える