在 if 语句中定义 JavaScript 变量是否正确?
if(a==1){
var b = 1;
} else {
var b = 0;
}
我知道上面的代码会起作用,但是,WebMatrix 会突出显示变量。
我应该在 if 语句之外定义变量吗?还是第一个选项是正确的?还是真的不重要?
var b = '';
if(a==1){
b = 1;
} else {
b = 0;
}
在 if 语句中定义 JavaScript 变量是否正确?
if(a==1){
var b = 1;
} else {
var b = 0;
}
我知道上面的代码会起作用,但是,WebMatrix 会突出显示变量。
我应该在 if 语句之外定义变量吗?还是第一个选项是正确的?还是真的不重要?
var b = '';
if(a==1){
b = 1;
} else {
b = 0;
}
从 ES2017 规范 (2017-07-08) 的正式发布开始,EcmaScript现在确实let
支持使用orconst
关键字的真正块作用域。
由于 ECMAscript 没有块作用域而是函数作用域,因此在函数上下文的顶部声明任何变量是一个非常好的主意。
即使您可以在函数上下文中的任何位置进行变量和函数声明,但如果您没有完全意识到后果,它会非常令人困惑并且会带来一些奇怪的头痛。
头痛示例:
var foo = 10;
function myfunc() {
if (foo > 0) {
var foo = 0;
alert('foo was greater than 0');
} else {
alert('wut?');
}
}
你猜怎么着,我们得到了一个'wut?在这里打电话时提醒myfunc
。这是因为 ECMAscript 解释器会自动将任何语句和函数声明提升到上下文的顶部。基本上,在第一个.var
foo
undefined
if statement
进一步阅读:JavaScript 作用域和提升
请注意,ECMAscript 6 确实支持使用 'let' 而不是 'var' 关键字的块级变量。虽然使用 'var' 声明的变量无论在何处声明都被提升为函数范围,但使用 'let' 定义的变量仅作用于封闭块。
将 var 放在 if 语句中并不违反语言的“规则”,但这意味着,由于 var 提升,无论 if 语句的条件是否满足,都会定义该 var。
请参阅JavaScript 中变量four
的范围是什么?
截至 2012 年,JavaScript 中没有块级范围。所以你的第一个版本很好:变量是在if
块外的范围内定义的。
因为 JavaScript 的变量具有函数级范围,所以您的第一个示例有效地重新声明了您的变量,这可以解释为什么它被突出显示。
在旧版本的 Firefox 上,其严格的 JavaScript 模式用于警告这种重新声明,但其中一位开发人员抱怨说它限制了他的风格,所以警告被关闭了。(当前版本的 Firefox 支持块级变量声明语法。)