Saya melihat banyak maklumat mengatakan bahawa objek mana yang memanggil fungsi ini, ini dalam fungsi ini menunjuk ke objek ini.
Dalam contoh berikut, fungsi foo dipanggil melalui pernyataan foo(). Bukankah Window.foo() dipanggil oleh objek global?
Sila beri nasihat, terima kasih!
var x = 10;
var obj = {
x: 20,
f: function () {
var foo = function (){
console.log(this.x);
}
foo();
}
};
obj.f(); //10
Terdapat masalah dengan apa yang dikatakan di tingkat atas Foo bukan pembolehubah global Cara mudah untuk menilai (mod tidak ketat) ialah:
1 Apabila fungsi tidak diberikan objek unggul, ini menunjuk ke tetingkap
2 . Apabila fungsi ditetapkan Apabila ia berkaitan dengan objek superior, ini hanya menunjuk kepada objek superior (induk) yang paling hampir
seperti foo.fn.o(), ini dalam o menunjuk ke fn
Beginilah rupanya, saya tulis di ruangan komen
Untuk
内部函数
,即声明在另一个函数体内的函数,都将会绑定到全局对象
上,这是JavaScript的设计缺陷
, kaedah reka bentuk yang betul ialah fungsi dalaman ini harus diikat pada objek yang sepadan dengan fungsi luarnya, yang membawa kepada masalah di atas.Untuk mengelakkan kecacatan reka bentuk ini, anda boleh menggunakan
变量替代
的方法,约定俗成,可以使用self
或that
, kodnya adalah seperti berikut:Pertama sekali, mari kita fahami satu perkara:
1: tetingkap juga merupakan objek, ia adalah objek istimewa, ia mewakili seluruh dunia. Apabila anda memanggil fungsi dengan cara berikut:
function foo(){....}
foo();//
Kaedah panggilan ini dalam baris kedua (tiada objek yang ditentukan oleh anda di hadapan fungsi) , Kami memanggilnya 'panggilan global'. Malah, ia bersamaan dengan window.foo(). Jadi adakah anda melihatnya? Memanggil fungsi secara global sebenarnya adalah kes khas untuk memanggil fungsi pada objek, kerana objek pada masa ini ialah tetingkap.
2: Jadi mengapa kod di atas memanggil foo() secara global dan bukannya pada obj? Saya akan menukar kod dan biarkan ia mengeluarkan 20:
Bandingkan dua keping kod dan cari perbezaannya.
Anda boleh menulis semula kod seperti ini:
Melalui contoh di atas, anda boleh memahami bahawa apabila memanggil fungsi, penghurai JavaScript dipanggil dalam bentuk panggilan atau memohon. Dengan cara ini, nyatakan nilai untuk ini dalam fungsi. Parameter pertama bagi kedua-dua kaedah ini ialah nilai dalaman kaedah foo ini apabila ia dipanggil Jika parameter pertama kaedah panggilan adalah batal atau tidak ditentukan, objek global akan digunakan sebagai parameter pertama secara lalai (anda boleh mencuba. Cuba foo.call(), foo.call(null), foo.call(undefined))
Fungsi dalam fungsi, penunjuk ini hilang