Warum gibt 2 statt 1 zurück? Scheint das zweite "var" wird still ignoriert.Implementiert JavaScript lexikalisches Scoping?
function foo()
{
var local = 1;
{
var local = 2;
}
return local;
}
foo()
/*
2
*/
Warum gibt 2 statt 1 zurück? Scheint das zweite "var" wird still ignoriert.Implementiert JavaScript lexikalisches Scoping?
function foo()
{
var local = 1;
{
var local = 2;
}
return local;
}
foo()
/*
2
*/
Von the MDN:
kein JavaScript Blockanweisung Umfang haben; eine Variable , die innerhalb eines Blocks deklariert wird, ist lokal für die Funktion (oder den globalen Bereich) , in der sich der Block befindet.
Der Umfang einer Variablen in JavaScript ist die gesamte Funktion, in der sie (bzw. die globale Reichweite) deklariert ist, so dass Sie nur eine Variable local
hier haben.
Ihr Code entspricht
function foo()
{
var local;
local = 1;
{
local = 2;
}
return local;
}
foo()
Beachten Sie, dass ES6 (die neue Norm von JavaScript) einführen macht einen lexical scoping with let
aber it's not yet really available.
Es ist verfügbar für Firefox und Nodejs Harmonie. – simonzack
@simonzack Hast du nicht bemerkt, dass ich mit dem Kangax-Tisch verbunden bin? Wenn OP nicht Server-Code-codiert ist, kann er es sich nicht leisten, mit IE und Chrome nicht kompatibel zu sein. Deshalb habe ich gesagt "nicht wirklich verfügbar". –
Ah ich sehe, ich habe nicht auf Ihren Link geklickt. – simonzack
In Javascript gibt es nur Funktionsumfang und globalen Geltungsbereich. Sie können keinen Blockbereich erstellen, er fügt keine besondere Bedeutung hinzu und erstellt keinen Bereich.
Und das ist, wie Sie Ihren Code endet
function foo()
{
var local = 1;
local = 2;
return local;
}
foo();
In ES6 können Sie auf Blockebene Bereiche mit Hilfe von Let erstellen. ES6 wird noch nicht unterstützt. mehr dazu here
Es sollte angemerkt werden, dass der lexikalische Umfang in naher Zukunft mit ES6 let-Schlüsselwort kommen wird. – Capaj
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –