Penutupan yang dipanggil harus merujuk kepada: fungsi dalaman membaca pembolehubah di luar fungsi semasa, iaitu konteks di mana ia dicipta.
fungsi hello(){
var char = "hello,world";
Cetak fungsi(){
console.log(char);
};
Kembalikan cetakan();
}
Perlu diingatkan bahawa fungsi cetakan di sini merujuk kepada pembolehubah char bagi fungsi hello luaran, jadi di sini kita boleh mengembalikan
hello, dunia
Dari satu segi, fungsi ini harus dikaitkan dengan skop. Sudah tentu, kami tidak mempunyai cara untuk mengakses char secara langsung, melainkan terdapat ralat apabila kami mengisytiharkan pembolehubah ini. Seperti
fungsi hello(){
char = "hello, dunia";
Cetak fungsi(){
console.log(char);
};
Kembalikan cetakan();
}
Hanya kerana terdapat var yang hilang.
Di sini hello menjadi penutup. Penutupan adalah sejenis objek istimewa. Ia terdiri daripada dua bahagian: fungsi, dan persekitaran di mana fungsi itu dicipta. Persekitaran terdiri daripada sebarang pembolehubah tempatan yang berada dalam skop semasa penutupan dibuat.
Penutupan JavaScript dan ini
Perlu diingatkan bahawa mungkin terdapat masalah semasa membaca ini dan hujah.
fungsi hello(){
This.char = "hello,world";
Output fungsi(){
char = "Saya bukan hello world";
console.log(this.char);
};
Kembalikan output();
}
Sudah tentu, contoh ini tidak cukup sesuai, jadi kami memerlukan contoh tambahan untuk menjelaskan masalah ini. Berikut adalah contoh dari "Pengaturcaraan Lanjutan Javascript" untuk menggambarkan masalah ini.
var name = "Tetingkap";
objek var = {
nama: "Objek Saya",
getNameFunc: function(){
mengembalikan fungsi(){
kembalikan this.name;
}
}
};
object.getNameFunc()()
Cuma penggunaan ini adalah nyata dan penyelesaiannya adalah untuk menyimpan pembolehubah sementara yang, seperti yang dinyatakan dalam artikel "
Sesetengah pengetahuan tentang ini dalam Javascript".
var name = "Tetingkap";
objek var = {
nama: "Objek Saya",
getNameFunc: function(){
var that = this;
mengembalikan fungsi(){
kembalikan nama itu;
}
}
};
object.getNameFunc()()
Javscript 클로저와 변수 읽기 및 쓰기
변수를 잘 처리하지 않으면 이러한 변수를 수정할 수도 있다는 점은 주목할 가치가 있습니다.
함수 hello(){
var char = "hello,world";
복귀{
세트: 함수(문자열){
반환 문자 = 문자열;
},
인쇄: function(){
console.log(문자)
}
}
}
var say = hello();
say.set('new hello,world')
say.print() // 새로운 Hello World
자바스크립트 클로저 및 성능
MDC 인용
일부 특정 작업에 클로저가 필요하지 않은 경우 클로저는 처리 속도 및 메모리 소비를 포함하여 스크립트 성능에 부정적인 영향을 미치기 때문에 불필요하게 다른 함수 내에 함수를 만드는 것은 현명하지 않습니다.
기사에서도 언급됐다.
예를 들어, 새 개체나 클래스를 만들 때 메서드는 일반적으로 개체의 생성자에서 정의되기보다는 개체의 프로토타입과 연결되어야 합니다. 그 이유는 생성자가 호출될 때마다(즉, 모든 객체 생성에 대해) 메서드가 다시 할당되기 때문입니다.