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

标签 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# 一样吗?

最佳答案

我认为您对严格模式和 JSHint 错误感到困惑。

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

What are the rules on scoping within conditionals and loops and such... is JavaScript supposed to be like C# in this way?

没有。 JavaScript 没有 block 作用域,但它有函数作用域。这意味着,如果在 block 内部声明变量(如 if 语句或循环构造),则其声明将“提升”到函数的顶部。查看这篇精彩文章,了解有关 variable declaration hoisting 的更多信息。 .

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

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

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

为了避免 JavaScript 中这种范围混淆,它是 good practice在它们所在函数的顶部声明所有变量(因为无论如何,这就是它们实际作用域的位置)。

关于javascript - 本地/网络服务器和 JS Bin 测试之间奇怪的范围差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048986/

相关文章:

javascript - 为什么我的 jQuery .css 函数不工作?

javascript - 在运行时生成 HTML 时设置 select 元素的值

javascript - NodeJS 中的高效深拷贝

javascript - 如何使用 Firebug 或任何其他扩展找到哪些 Javascript 代码触发表单提交?

javascript - Viewbag 改变 onclick 中的值?

c# - 从 Windows 窗体过渡到 WPF

c# - 在 C# 中获取范围之间的十六进制值

javascript - Google map API v3 - setPosition 后标记消失

c# - 性能和线程改进 ASP.Net MVC

javascript - 如何使用 "this"隐藏元素?