本地/网络服务器和JS Bin测试之间的好奇范围差异

时间:2014-11-20 20:31:26

标签: javascript c# jquery html

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

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

但它breaks in JSBin和jsFiddle,说test1超出了范围。

为什么它可以在我的网络服务器上运行,但在其他地方打破?在条件和循环中确定范围的规则是什么......这样的JavaScript应该像C#一样?

1 个答案:

答案 0 :(得分:1)

我认为你得到了严格的模式和JSHint错误。

在JSBin中,JSHint is issuing the 'test1' used out of scope error。这与严格模式无关。在您的网络服务器上,一切正常,因为严格模式对此类变量范围问题没有意见。 JSBin正在为您运行JSHint,而您的Web服务器可能不是。

  

在条件和循环中确定范围的规则是什么......这样的JavaScript应该像C#一样?

没有。 JavaScript没有块范围,但它具有功能范围。这意味着如果在块内部声明变量(如if语句或循环结构),则其声明为#34;悬挂"到功能的顶部。有关variable declaration hoisting的更多信息,请查看这篇精彩的文章。

特别是对于您的代码,它被解释为就像您已经这样写过:

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

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

为了避免在JavaScript中对范围产生这种混淆,我们要good practice将所有变量声明为他们所处的函数的顶部(因为那是'无论如何,它们实际上都是作用的。)