这是我浏览器的 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++)

你正在初始化Hzzz,但不是声明 Hzzz 因此,即使它在函数中,它也成为隐式全局。

将其显式声明为函数局部的代码为:

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 constvar 可用于控制变量范围。

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);