在if语句中定义JavaScript变量
Defining JavaScript variables inside if-statements
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
或const
关键字支持真正的块作用域。
由于ECMAscript没有块作用域,而是函数作用域,因此在函数上下文顶部声明任何变量都是一个非常好的主意。
尽管可以在函数上下文中的任何时候进行变量和函数声明,但如果您没有完全意识到后果,这会非常令人困惑,并带来一些奇怪的头痛。
头痛示例:
var foo = 10;
function myfunc() {
if (foo > 0) {
var foo = 0;
alert('foo was greater than 0');
} else {
alert('wut?');
}
}
你猜怎么着,我们得到了一个武特此处呼叫myfunc
时发出警报。这是因为ECMAscript解释器将自动将任何var
语句和函数声明提升到上下文顶部。基本上,foo
在第一个if statement
之前被初始化为undefined
。
进一步阅读:JavaScript范围界定和提升
请注意,ECMAscript 6确实支持使用"let"而不是"var"关键字的块级变量。虽然用"var"声明的变量被提升为函数范围,无论它们在哪里声明,但使用"let"定义的变量的范围仅限于封闭块。
在if语句中放入var并不违反该语言的"规则",但这意味着,由于var提升,无论if语句的条件是否满足,都将定义该var。
因为JavaScript的变量具有函数级作用域,所以第一个例子是有效地重新定义变量,这可以解释为什么它会被突出显示。
在旧版本的Firefox上,其严格的JavaScript模式用于警告这种重新声明,但其一名开发人员抱怨这限制了他的风格,因此关闭了警告。(当前版本的Firefox支持块级变量声明语法。)
请参阅函数four
关于JavaScript中变量的作用域是什么?
截至2012年,JavaScript中没有块级作用域。所以您的第一个版本很好:变量是在if
块之外的范围中定义的。
- 将函数的上下文应用于javascript变量
- 如何通过ajax刷新JSF填充的javascript变量
- Javascript变量赋值|
- 限制javascript变量的最小/最大整数
- 来自文本输入null的html javascript变量
- 访问jsrender模板中的全局javascript变量并更新它
- 从数据库中获取数据并插入JavaScript变量
- 如何将javascript变量传递到Meteor Spacebars模板中
- 将JavaScript变量保存到Rails模型
- 在if语句下的html中使用javascript变量
- Javascript变量分配-按类别
- 操作javascript变量[HTML]以只显示文本
- 无法比较javascript变量
- 如何将smarty变量与javascript变量进行比较
- 如何使用PHP将javascript变量添加到mysql数据库中
- Javascript 变量使用 jquery 查找变量
- 重新加载页面时Javascript变量发生变化
- 在asp classic中使用javascript变量
- 全局Javascript变量变为null
- 如何向服务器端提交javascript变量