Ho incontrato un problema molto strano (per me) con la parola chiave var
. L'ho ridotto a un caso di test abbastanza minimale, e ho scoperto che è esposto in Node.js (quindi, V8 e Chrome), Inspector di Safari 4 (quindi, Nitro) e FireBug (ovviamente, SpiderMonkey). Inizialmente stavo preparando un bug report, ma dal momento che è così ampiamente visualizzato, assumerò che io fraintenda completamente il modo in cui JavaScript suppone l'ambito e la ricerca delle variabili.Operazione confusa della parola chiave `var` di JavaScript
Il banco di prova è molto piccolo, e su GitHub qui: http://gist.github.com/260067. L'unica differenza tra il primo e il secondo esempio è l'inclusione della parola chiave var
.
Qui, pure, è un banco di prova simile che presenta lo stesso 'problema' in un modo diverso: https://gist.github.com/698b977ee0de2f0ee54a
Edit: da escludere qualsiasi altre risposte che cercano di spiegare come funziona portata a cascata, io' Mi sono intimamente familiare. Il mio problema è che io non capisco perché il seguente codice 'funziona' (in quanto alert()
s 'esterno', seguito da 'interna', e poi di nuovo 'esterna'):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
Il var foo;
si verifica in una posizione del tutto irrilevante alla riassegnazione di foo
; quindi perché influenza questo incarico in modo sostanziale?
Perché stai utilizzando una valutazione? Non c'è assolutamente alcun motivo per usare eval nel codice che hai postato. – Marius
Per dimostrare il problema. L'effettiva implementazione è molto diversa; puoi vederlo allo stato naturale qui: http://github.com/elliottcable/poopy.js/blob/new-acquire/lib/from.js#L193 – ELLIOTTCABLE
Il tuo ultimo esempio funziona perché 1) foo = 'inner'; assegna il valore allo scope genitore foo, a cui questa funzione ha accesso. 2) non è necessario utilizzare var per dichiarare una variabile. – Marius