E 'molto semplice: JS issare le dichiarazioni variabili alla parte superiore dell'ambito corrente, ma eventuali operazioni (tra cui le assegnazioni) non sono issato (all'interno dello stesso scopo, vedere la seconda spiegazione), naturalmente. Così il vostro frammento è tradotto per
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
tralasciando il var, procede alla scansione portata (il controllo per la variabile viene dichiarata nello scope globale).
Purtroppo, nel fare ciò, il contesto del primo utilizzo della var viene perso (all'interno di una diramazione) e anche l'assegnazione viene sollevata. Un implicito globale è tradotto in
:
Grazie a dio questo non è vero. Ho pensato che lo fosse, perché ho verificato un paio di cose nella console che sembravano confermarlo. In questo caso @amadan ha ragione: stai utilizzando la variabile globale (chiamata greeting
nello snippet per errore quando l'ho pubblicata). Lascerò il codice qui sotto (corretto) per mostrare cosa sono effettivamente le implicite globals, sperando che aiuti qualcuno a capire a fondo gli scope/scope-scanning in JS.
var currentSize = 'hello';
//well, actually implied globals can be deleted, so it's more like
Object.defineProperty(this,'currentSize',{value:undefined,
writable:true,
enumerable:true,
configurable:true});
(function()
{
if (currentSize == 'hi')//always false
{//this still doesn't get executed
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined
}());
fonte
2012-11-29 12:53:05
+1 Risposta ben formulata e chiara. – Aesthete
+1 davvero per voi signore. –
@bfavaretto: ho pensato che 'var greeting' fosse un errore, e si supponeva fosse la dichiarazione delle variabili globali' var currentSize' (che sarebbe stata oscurata nel primo esempio e utilizzata nel secondo). Altrimenti sarebbe del tutto irrilevante per l'esempio. – Amadan