La différence entre les deux est que Snippet B utilise un constructor function en préfixant l'appel avec le mot-clé new
, tandis que A ne soit pas extrait. C'est la réponse courte.
La réponse longue est que même si l'extrait A introduit une nouvelle portée sur chaque appel de fonction anonyme, car il est pas utilisé dans un contexte constructeur, il est variable de this
indique simplement l'objet window
global. Donc snippet A est équivalent à ceci:
var x = (function(){ window.id="Dog"; return window; }());
var y = (function(){ window.id="Cat"; return window; }());
Ainsi, chaque invocation aplatit juste la même variable [global].
Puisque l'extrait B utilise le mot clé new
, vous définissez et appelez immédiatement une fonction de constructeur. JavaScript procède à l'initialisation de la variable this
dans la fonction constructeur pour pointer vers une nouvelle instance de la fonction anonyme [juste définie].
Vous avez peut-être déjà vu l'idiome new function(){}
présenté comme le meilleur moyen de définir et d'exécuter immédiatement un bloc de code. Eh bien, il vient avec le surcoût de l'instanciation de l'objet JavaScript (comme vous l'avez trouvé), et n'est généralement plus utilisé aussi largement.
+1 Bonne réponse –