La soi-disant fermeture doit faire référence à : la fonction interne lit les variables en dehors de la fonction actuelle, c'est-à-dire le contexte dans lequel elle a été créée.
fonction bonjour(){
var char = "bonjour, le monde";
Fonction print(){
console.log(char);
};
Retourner print();
>
Il convient de noter que la fonction print fait ici référence à la variable char de la fonction hello externe, nous pouvons donc ici renvoyer un
bonjour le monde
En un sens, cette fonction devrait être attribuée au champ d’application. Bien entendu, nous n’avons aucun moyen d’accéder directement à char, sauf en cas d’erreur lorsque nous déclarons cette variable. Comme
fonction bonjour(){
char = "bonjour, le monde";
Fonction print(){
console.log(char);
};
Retourner print();
>
Tout simplement parce qu'il manque une variable.
Ici, le bonjour devient une clôture. Les fermetures sont un type d’objet particulier. Il se compose de deux parties : la fonction et l'environnement dans lequel la fonction est créée. L'environnement se compose de toutes les variables locales qui étaient dans la portée lors de la création de la fermeture.
Fermeture Javascript et ça
Il est à noter qu'il peut y avoir des problèmes lors de la lecture de ceci et des arguments.
fonction bonjour(){
This.char = "bonjour, le monde";
Sortie de fonction(){
char = "Je ne suis pas bonjour tout le monde";
console.log(this.char);
};
Renvoie la sortie();
>
Bien sûr, cet exemple n'est pas assez approprié, nous avons donc besoin d'un exemple supplémentaire pour expliquer ce problème. Voici un exemple de "Javascript Advanced Programming" pour illustrer ce problème.
var name = "La fenêtre";
var objet = {
nom : "Mon objet",
getNameFunc : function(){
fonction de retour(){
return this.name;
>
>
};
objet.getNameFunc()()
C'est juste que cet usage est réel, et la solution est de sauvegarder une variable temporaire qui, comme mentionné dans l'article "
Quelques connaissances à ce sujet en Javascript".
var name = "La fenêtre";
var objet = {
nom : "Mon objet",
getNameFunc : function(){
var ça = ceci ;
fonction de retour(){
return that.name;
>
>
};
objet.getNameFunc()()
Javscript 閉包與讀寫變數
值得注意的是,如果我們沒有處理好我們的變數時,我們也可以修改這些變數。
function hello(){
var char = "hello,world";
return{
set: function(string){
return char = string;
},
print: function(){
console.log(char)
}
}
}
var say = hello();
say.set('new hello,world')
say.print() // new hello world
Javascript 閉包與效能
引用MDC的說法
如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函數中創建函數是不明智的,因為閉包對腳本性能具有負面影響,包括處理速度和內存消耗。
文上還說到。
例如,在建立新的物件或類別時,方法通常應該關聯於物件的原型,而不是定義到物件的建構器中。原因是這將導致每次構造器被調用,方法都會被重新賦值一次(也就是說,為每個物件的創建)。