var foo = {
bar: function () {
alert(this);
}
};
foo.bar(); // Reference, OK => foo (1)
(foo.bar)(); // Reference, OK => foo (2)
(foo.bar = foo.bar)(); // global? (3)
Bolehkah anda terangkan mengapa keputusan (2) dan (3) berbeza?
var temp =foo.bar=foo.bar;
temp();
Tugasan berterusan
Faham?
Oleh kerana ini tidak dipanggil sebagai kaedah objek tetapi sebagai panggilan fungsi, jadi ini menunjukkan kepada undefined, dan dalam mod tidak ketat, undefined menunjuk ke dunia global.
Ini ditakrifkan oleh konteks semasa pelaksanaan, jadi secara semulajadi sesiapa yang memanggil ini adalah siapa
Panggilan dalam (2) ialah foo.bar, maka ini telah menemui objek foo;
Apabila memanggil (3), terdapat tugasan dahulu dan foo.bar ditetapkan kepada foo.bar, supaya ia menjadi pembolehubah global. Fungsi ini dipanggil secara global, jadi sudah tentu ia menunjukkan kepada undefined (mod tidak ketat dalam persekitaran penyemak imbas).
Berdasarkan komen kod, penyoal mungkin tidak faham (3) Berikut ialah penjelasannya:
foo.bar = foo.bar
Ungkapan mengembalikan fungsi tanpa nama, iaitufunction( ) {alert(this);}
.foo.bar = foo.bar
表达式返回的是匿名函数,即function() {alert(this);}
。所以再调用相当于该匿名函数的自调用,即
(function() {alert(this);})();
。补充下:
🎜Tambahan: 🎜(foo.bar)
表达式返回小括号里的,即foo.bar
。然后foo.bar
作为函数被调用,即foo.bar()
。而赋值表达式是将右侧的即
foo
对象的bar
Jadi panggilan itu bersamaan dengan panggilan kendiri bagi fungsi tanpa nama, iaitu,(function() {alert(this);})();
.(foo.bar)
Ungkapan mengembalikan apa yang ada dalam kurungan, iaitu,foo.bar
. Kemudianfoo.bar
dipanggil sebagai fungsi, iaitufoo.bar()
. 🎜Ungkapan tugasan memberikan nilai yang disimpan dalambar
objekfoo
di sebelah kanan ke sebelah kiri dan mengembalikannya. 🎜var foo = {
bar: function () {
}
};
(foo.bar)(); // Rujukan, OK => foo (2)
Nota: (foo.bar)() di sini Ia adalah bersamaan dengan foo.bar(), yang melaksanakan kaedah bar dalam objek foo Ini menunjuk ke objek foo
(foo.bar = foo.bar)();
Nota: Pertama lihat foo.bar = foo.bar, foo.bar ialah fungsi () {alert(this);} ditugaskan kepada foo.bar,
Then (foo.bar = foo. bar ) adalah sama dengan (function(){alert(this)}), kemudian menambah outer () ialah fungsi segera:
(function(){alert(this)})(); ialah tingkap global.
Ungkapan tugasan mengembalikan global =》window
foo.bar is assigned function(){alert(this)} this point to window globally