[英]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.