繁体   English   中英

本地/ Web服务器与JS Bin测试之间的范围界定差异

[英]Curious scoping difference between local/webserver and JS Bin test

似乎JS 严格模式不允许声明隐式全局变量,但不会影响对条件(if)或循环(while)内部定义的变量的访问。 C#中 ,您无法访问在条件或外部循环中声明的变量。 但是,在JavaScript中,以下工作原理:

        "use strict";
        (function() {
            var mybool = true;
            if (mybool) {
                var test = "test;      
                console.log(test);      //"test"
            }
            console.log(test);          //"test"
        }());

但是它破坏了JSBin和jsFiddle,表示test1不在范围内。

为什么它可以在我的Web服务器上工作,但在其他地方却无法使用? 条件和循环中的作用域定义有哪些规则,例如……JavaScript是否应以这种方式像C#?

我认为您正在使用严格模式,并且JSHint错误造成混淆。

在JSBin中, JSHint发出超出范围错误使用'test1' 这与严格模式无关。 在您的Web服务器上,一切都可以正常工作,因为严格模式对这种可变范围问题没有意见。 JSBin正在为您运行JSHint,而您的Web服务器可能没有。

条件和循环中的作用域定义有哪些规则,例如……JavaScript是否应以这种方式像C#?

否。JavaScript没有块范围 ,但确实有函数范围 这意味着,如果变量在块内部声明(如if语句或循环构造),则其声明“悬挂”在函数顶部。 查阅这篇很棒的文章,以获取有关变量声明提升的更多信息。

特别是对于您的代码,它的解释就像您这样编写:

(function() {
    var mybool = true,
        test; /* = undefined */

    if (mybool) {
        test = "test;      
        console.log(test);      //"test"
    }
    console.log(test);          //"test"
}());

为了避免这种对JavaScript范围的混淆,将所有变量声明在其所处函数的顶部是个好习惯 (因为无论如何,实际上都是在它们的作用域内)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM