【问题标题】:Is this a scope error/leak in the JavaScript for-loop implementation of my browser or my misunderstanding? [duplicate]这是我的浏览器的 JavaScript for 循环实现中的范围错误/泄漏还是我的误解? [复制]
【发布时间】:2021-03-22 19:38:44
【问题描述】:

如果我运行下面的代码,它会按预期运行。 (预计普通代码语言和 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);
};

当运行下面的代码时,它会因为子函数内部的变量被修改而失败:

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

【问题讨论】:

  • 自从发布问题以来,我已经确认其他浏览器中的行为是相同的,并且如果 H 参数被声明为变量。

标签: javascript for-loop web scope global-variables


【解决方案1】:

在您的第一段代码中,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);

【讨论】:

    【解决方案2】:

    在您展示的两个循环示例中,您的变量没有正式声明,因此默认情况下它们变为全局变量。

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

    真的,这里你需要了解的是所谓的“作用域链”,也就是I've also written about here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多