for 循环作用域是否唯一
Is a for loops scope unique
我 运行 在执行一些技术债务职责时参与其中。变量 foo
的范围是什么?真的是"already defined"吗?
function fn(){
for (var i = 0; i < m.length; i++) {
if(condition)
for (var j = 0; j < m.length; j++) {
var foo = "bar";
}
else
var foo = "fubar"
}
}
更新:问题是关于条件块中定义的变量的范围。因为它没有嵌套在 function/closure 中,所以没有唯一的范围。
这里有一个片段来说明:
var x = "foo",
a = [];
for(var i=0;i<10;i++){
var x = {value:1+i};
a.push(x)
}
document.write("<pre>" +
x.value + "\n" +
JSON.stringify(a,null," ") +
"</pre>"
);
JavaScript 中在 if 或 for 内声明的变量可在声明的代码行 运行 之后在 if 或 for 外部访问。例如:
function DoThing() {
for (var i = 0; i < 1; ++i)
var x = 0;
return x;
}
DoThing(); // returns 0;
在您提供的示例中,变量是在到达给定条件为真的 for 循环主体之后声明的,或者在 else 语句的主体中声明的。由于这些条件是相互排斥的,因此永远不会单独由该条件重新声明。然而,该变量将由它所在的循环重新声明。
也就是说代码不是很好读,我建议重构它,不要在 if 语句中嵌套 for 循环,并且不要在 if 和 else 中都声明一个新变量,更不用说了在 for 循环体内。
JavaScript 只有函数作用域,没有块作用域。所以你的变量 foo 存在于函数级别并且两个赋值都引用同一个实例。
var m = [ 1, 2, 3 ];
var x = fn(m, true);
WScript.Echo( x );
var x = fn(m, false);
WScript.Echo( x );
function fn(m, condition){
for (var i = 0; i < m.length; i++) {
if(condition)
for (var j = 0; j < m.length; j++) {
var foo = "bar";
}
else
var foo = "fubar"
}
return foo;
}
我 运行 在执行一些技术债务职责时参与其中。变量 foo
的范围是什么?真的是"already defined"吗?
function fn(){
for (var i = 0; i < m.length; i++) {
if(condition)
for (var j = 0; j < m.length; j++) {
var foo = "bar";
}
else
var foo = "fubar"
}
}
更新:问题是关于条件块中定义的变量的范围。因为它没有嵌套在 function/closure 中,所以没有唯一的范围。
这里有一个片段来说明:
var x = "foo",
a = [];
for(var i=0;i<10;i++){
var x = {value:1+i};
a.push(x)
}
document.write("<pre>" +
x.value + "\n" +
JSON.stringify(a,null," ") +
"</pre>"
);
JavaScript 中在 if 或 for 内声明的变量可在声明的代码行 运行 之后在 if 或 for 外部访问。例如:
function DoThing() {
for (var i = 0; i < 1; ++i)
var x = 0;
return x;
}
DoThing(); // returns 0;
在您提供的示例中,变量是在到达给定条件为真的 for 循环主体之后声明的,或者在 else 语句的主体中声明的。由于这些条件是相互排斥的,因此永远不会单独由该条件重新声明。然而,该变量将由它所在的循环重新声明。
也就是说代码不是很好读,我建议重构它,不要在 if 语句中嵌套 for 循环,并且不要在 if 和 else 中都声明一个新变量,更不用说了在 for 循环体内。
JavaScript 只有函数作用域,没有块作用域。所以你的变量 foo 存在于函数级别并且两个赋值都引用同一个实例。
var m = [ 1, 2, 3 ];
var x = fn(m, true);
WScript.Echo( x );
var x = fn(m, false);
WScript.Echo( x );
function fn(m, condition){
for (var i = 0; i < m.length; i++) {
if(condition)
for (var j = 0; j < m.length; j++) {
var foo = "bar";
}
else
var foo = "fubar"
}
return foo;
}