var foo = {
bar: function () {
alert(this);
}
};
foo.bar(); // Reference, OK => foo (1)
(foo.bar)(); // Reference, OK => foo (2)
(foo.bar = foo.bar)(); // global? (3)
Pouvez-vous expliquer pourquoi les résultats de (2) et (3) sont différents ?
var temp =foo.bar=foo.bar;
temp();
Tâche continue
Compris ?
Parce que ceci n'est pas appelé comme une méthode objet mais comme un appel de fonction, cela pointe donc vers undéfini, et en mode non strict, undéfini pointe vers le monde global.
Ceci est défini par le contexte lors de l'exécution, donc naturellement celui qui appelle ceci est qui
L'appel dans (2) est foo.bar, alors ceci a trouvé l'objet foo ;
Lors de l'appel de (3), il y a d'abord une affectation, et foo.bar est affecté à foo.bar, de sorte qu'il devienne une variable globale. Cette fonction est appelée globalement, donc bien sûr elle pointe vers undefined (mode non strict dans l'environnement du navigateur).
À en juger par les commentaires du code, la personne qui pose la question peut tout simplement ne pas comprendre (3). Voici l'explication :
foo.bar = foo.bar
L'expression renvoie une fonction anonyme, c'est-à-dire. function( ) {alerte(this);}
.foo.bar = foo.bar
表达式返回的是匿名函数,即function() {alert(this);}
。所以再调用相当于该匿名函数的自调用,即
(function() {alert(this);})();
。补充下:
🎜Ajout : 🎜(foo.bar)
表达式返回小括号里的,即foo.bar
。然后foo.bar
作为函数被调用,即foo.bar()
。而赋值表达式是将右侧的即
foo
对象的bar
L'appel est donc équivalent à l'auto-appel de la fonction anonyme, c'est-à-dire(function() {alert(this);})();
.(foo.bar)
L'expression renvoie ce qui est entre parenthèses, c'est-à-direfoo.bar
. Ensuite,foo.bar
est appelé en tant que fonction, c'est-à-direfoo.bar()
. 🎜L'expression d'affectation attribue la valeur stockée dans labar
de l'objetfoo
du côté droit au côté gauche et la renvoie. 🎜var foo = {
barre : fonction() {
}
};
(foo.bar)(); // Référence, OK => foo (2)
Remarque : (foo.bar)() ici est équivalent au premier foo.bar(), qui exécute la méthode bar dans l'objet foo. Cela pointe vers l'objet foo
(foo.bar = foo.bar)( // global?
Remarque : Regardez d'abord foo.bar = foo.bar, foo.bar est la fonction () {alert(this);} assignée à foo.bar,
Puis (foo.bar = foo. bar ) est égal à (function(){alert(this)}), alors l'ajout de l'extérieur () est une fonction instantanée :
(function(){alert(this)})(); est la fenêtre globale.
L'expression d'affectation renvoie le global =》window
foo.bar se voit attribuer une fonction(){alert(this)} qui pointe vers la fenêtre globalement