(2)と(3)の結果が異なる理由を説明できますか?
认证0级讲师
var temp =foo.bar=foo.bar;temp();連続代入わかりますか? これはオブジェクト メソッドとしてではなく関数呼び出しとして呼び出されるため、これは未定義を指し、非厳密モードでは未定義はグローバル世界を指します。
これは実行コンテキストによって定義されるため、当然これを呼び出す人は誰になります
(2) の呼び出しは foo.bar であり、これにより foo オブジェクトが見つかりました。
(3)を呼び出すと、最初に代入があり、foo.barにfoo.barが代入され、グローバル変数になります。この関数はグローバルに呼び出されるため、当然ながら未定義 (ブラウザ環境では非厳密モード) を指します。
コードのコメントから判断すると、質問者は (3) を理解していない可能性があります。説明は次のとおりです。 foo.bar = foo.bar式は匿名関数、つまり を返します。 function( ) {alert(this);}。 foo.bar = foo.bar表达式返回的是匿名函数,即function() {alert(this);}。所以再调用相当于该匿名函数的自调用,即(function() {alert(this);})();したがって、この呼び出しは匿名関数の自己呼び出し、つまり (function() {alert(this);})(); と同等です。
foo.bar = foo.bar
を返します。 function( ) {alert(this);}
function() {alert(this);}
(function() {alert(this);})();
追加: (foo.bar)この式は括弧内にあるもの、つまり foo.bar を返します。次に、foo.bar が関数として呼び出されます (つまり、foo.bar())。 (foo.bar)表达式返回小括号里的,即foo.bar。然后foo.bar作为函数被调用,即foo.bar()。而赋值表达式是将右侧的即foo对象的bar代入式は、右側の foo オブジェクトの bar に格納されている値を左側に代入して返します。
(foo.bar)
foo.bar
foo.bar()
foo
bar
var foo = { bar: function () {
}};(foo.bar)(); // 参照、OK => foo (2) 注: (foo.bar)() は最初の foo.bar() と同等です。これは foo オブジェクトの bar メソッドです(foo.bar = foo.bar)(); // グローバル? (3) 注: 最初に foo.bar = foo.bar, foo を見てください。 .bar は foo.bar に割り当てられた function () {alert(this);} であり、(foo.bar = foo.bar) は (function(){alert(this)}) と等しく、外側の () を追加します。は即時関数です: (function(){alert(this)})(); したがって、ここで指すのはグローバル ウィンドウです。
代入式はグローバル=》windowを返しますfoo.barにはfunction(){alert(this)}が割り当てられており、これはグローバルにウィンドウを指します
var temp =foo.bar=foo.bar;
temp();
連続代入
わかりますか?
これはオブジェクト メソッドとしてではなく関数呼び出しとして呼び出されるため、これは未定義を指し、非厳密モードでは未定義はグローバル世界を指します。
これは実行コンテキストによって定義されるため、当然これを呼び出す人は誰になります
(2) の呼び出しは foo.bar であり、これにより foo オブジェクトが見つかりました。
(3)を呼び出すと、最初に代入があり、foo.barにfoo.barが代入され、グローバル変数になります。この関数はグローバルに呼び出されるため、当然ながら未定義 (ブラウザ環境では非厳密モード) を指します。
コードのコメントから判断すると、質問者は (3) を理解していない可能性があります。説明は次のとおりです。
foo.bar = foo.bar
式は匿名関数、つまりを返します。 function( ) {alert(this);}
。foo.bar = foo.bar
表达式返回的是匿名函数,即function() {alert(this);}
。所以再调用相当于该匿名函数的自调用,即
(function() {alert(this);})();
したがって、この呼び出しは匿名関数の自己呼び出し、つまり(function() {alert(this);})();
と同等です。追加:
(foo.bar)
この式は括弧内にあるもの、つまりfoo.bar
を返します。次に、foo.bar
が関数として呼び出されます (つまり、foo.bar()
)。(foo.bar)
表达式返回小括号里的,即foo.bar
。然后foo.bar
作为函数被调用,即foo.bar()
。而赋值表达式是将右侧的即
foo
对象的bar
代入式は、右側のfoo
オブジェクトのbar
に格納されている値を左側に代入して返します。var foo = {
リーリーbar: function () {
}
};
(foo.bar)(); // 参照、OK => foo (2)
注: (foo.bar)() は最初の foo.bar() と同等です。これは foo オブジェクトの bar メソッドです
(foo.bar = foo.bar)(); // グローバル? (3)
注: 最初に foo.bar = foo.bar, foo を見てください。 .bar は foo.bar に割り当てられた function () {alert(this);} であり、(foo.bar = foo.bar) は (function(){alert(this)}) と等しく、外側の () を追加します。は即時関数です:
(function(){alert(this)})(); したがって、ここで指すのはグローバル ウィンドウです。
代入式はグローバル=》windowを返します
foo.barにはfunction(){alert(this)}が割り当てられており、これはグローバルにウィンドウを指します