这是我浏览器的 JavaScript for 循环实现中的范围 error/leak 还是我的误解?
Is this a scope error/leak in the JavaScript for-loop implementation of my browser or my misunderstanding?
如果我 运行 下面的代码按预期运行。 (预计普通代码语言和 JavaScript 在函数中都具有“局部作用域”)因此变量不会被子函数更改。
testFunc(0);
var bFunc = function(){
for(H=1; H<5;H++){}
alert("bFunc H:"+H);
};
var testFunc = function(H){
alert("CallId 1, H: " + H);
bFunc();
alert("CallId 2, H: " + H);
};
当 运行ning 下面的代码失败时,子函数内的变量被修改:
forFunc();
var cFunc = function(){
for(zzz = 0; zzz < 30; zzz++)
{}
}
var forFunc = function(){
for(zzz = 0; zzz < 5; zzz++){
alert("zzz:"+zzz);
cFunc();
}
alert("Scope leak if not 5:"+zzz);
}
在您展示的两个循环示例中,您的变量未正式声明,因此默认情况下它们成为全局变量。
for(H=1; H<5;H++){}
for(zzz = 0; zzz < 30; zzz++)
你正在初始化H
和zzz
,但不是声明 H
和zzz
因此,即使它在函数中,它也成为隐式全局。
将其显式声明为函数局部的代码为:
for(var H=1; H<5;H++){} // Function Scope
for(var zzz = 0; zzz < 30; zzz++)
或:
for(let H=1; H<5;H++){} // Block Scope
for(let zzz = 0; zzz < 30; zzz++)
使用 testFunc
,您声明了一个名为 H
的参数,因此它成为该函数的隐式局部变量,并且它“隐藏”了全局 H
.
var testFunc = function(H){
真的,你在这里需要了解的是所谓的“范围链”,即。
在您的第一段代码中,bFunc 中的 H 是一个全局变量。 testFunc 中的 H 不是因为它是函数的参数。第二个示例中的 zzz 始终在全局范围内。 let
const
和 var
可用于控制变量范围。
var bFunc = function(){
for(H=1; H<5;H++){}
};
var testFunc = function(H){
console.log("CallId 1, window.H: " + window.H);
bFunc();
console.log("CallId 2, window.H: " + window.H);
};
testFunc(0);
var bFunc = function(){
for(let J=1; J<5;J++){}
};
var testFunc = function(J){
console.log("CallId 1, window.J: " + window.J);
bFunc();
console.log("CallId 2, window.J: " + window.J);
};
testFunc(0);
如果我 运行 下面的代码按预期运行。 (预计普通代码语言和 JavaScript 在函数中都具有“局部作用域”)因此变量不会被子函数更改。
testFunc(0);
var bFunc = function(){
for(H=1; H<5;H++){}
alert("bFunc H:"+H);
};
var testFunc = function(H){
alert("CallId 1, H: " + H);
bFunc();
alert("CallId 2, H: " + H);
};
当 运行ning 下面的代码失败时,子函数内的变量被修改:
forFunc();
var cFunc = function(){
for(zzz = 0; zzz < 30; zzz++)
{}
}
var forFunc = function(){
for(zzz = 0; zzz < 5; zzz++){
alert("zzz:"+zzz);
cFunc();
}
alert("Scope leak if not 5:"+zzz);
}
在您展示的两个循环示例中,您的变量未正式声明,因此默认情况下它们成为全局变量。
for(H=1; H<5;H++){}
for(zzz = 0; zzz < 30; zzz++)
你正在初始化H
和zzz
,但不是声明 H
和zzz
因此,即使它在函数中,它也成为隐式全局。
将其显式声明为函数局部的代码为:
for(var H=1; H<5;H++){} // Function Scope
for(var zzz = 0; zzz < 30; zzz++)
或:
for(let H=1; H<5;H++){} // Block Scope
for(let zzz = 0; zzz < 30; zzz++)
使用 testFunc
,您声明了一个名为 H
的参数,因此它成为该函数的隐式局部变量,并且它“隐藏”了全局 H
.
var testFunc = function(H){
真的,你在这里需要了解的是所谓的“范围链”,即
在您的第一段代码中,bFunc 中的 H 是一个全局变量。 testFunc 中的 H 不是因为它是函数的参数。第二个示例中的 zzz 始终在全局范围内。 let
const
和 var
可用于控制变量范围。
var bFunc = function(){
for(H=1; H<5;H++){}
};
var testFunc = function(H){
console.log("CallId 1, window.H: " + window.H);
bFunc();
console.log("CallId 2, window.H: " + window.H);
};
testFunc(0);
var bFunc = function(){
for(let J=1; J<5;J++){}
};
var testFunc = function(J){
console.log("CallId 1, window.J: " + window.J);
bFunc();
console.log("CallId 2, window.J: " + window.J);
};
testFunc(0);