似乎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#一样?
答案 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将所有变量声明为他们所处的函数的顶部(因为那是'无论如何,它们实际上都是作用的。)