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
var x = 10;
var obj = {
x: 20,
f: function () {
var foo = function (){
console.log(this.x);//你這是把函數(shù)賦值給一個 foo的變量。此時的 foo 是全局的,所以下面調(diào)用 foo()這里是10嘛
}
foo();
}
};
obj.f(); // 這個調(diào)用 f 函數(shù),因?yàn)?f(),并沒有返回出去什么,所以這里是 undefined
Untuk 內(nèi)部函數(shù)
,即聲明在另一個函數(shù)體內(nèi)的函數(shù),都將會綁定到全局對象
上,這是JavaScript的設(shè)計(jì)缺陷
, 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:
var x = 10;
var obj = {
x: 20,
f: function () {
var self = this;
var foo = function (){
console.log(self.x);
}
foo();
}
};
obj.f();
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:
var x = 10;
var obj = {
x: 20,
f: function () {
console.log(this.x);
}
};
obj.f();//20
Bandingkan dua keping kod dan cari perbezaannya.
var x = 10;
var obj = {
x: 20,
f: function () {
console.log(this.x); // 20
var foo = function (){
// 這里函數(shù)的作用域是window
console.log(this.x);
}
foo();
}
};
obj.f(); //10
var x = 10;
var obj = {
x: 20,
f: function () {
let that = this;
var foo = function (){
// 這里形成了閉包
console.log(that.x);
}
foo();
}
};
obj.f(); //20
Anda boleh menulis semula kod seperti ini:
var x = 10;
var obj = {
x: 20,
f: function () {
var foo = function (){
console.log(this.x);
}
foo.call(null) // 等價于foo.call(window)
}
};
obj.f.call(obj); //10 結(jié)果不變
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))