[英]What is the JavaScript variable scope in a switch / case statement?
在使用ASP.NET MVC创建JavaScript时,我注意到了几个范围警告,并意识到我在理解switch / case语句中的变量范围时遗漏了一些东西。
警告:'i'已经定义,参考案例b和案例c
我的代码看起来类似于:
switch(element) {
case 'a':
for(var i=0; i < count; i++){
do something
}
break;
case 'b':
for(var i=0; i < count; i++){
do something
}
break;
case 'c':
for(var i=0; i < count; i++){
do something
}
break;
}
我认为范围以每个break语句结束,但似乎范围不会在switch / case结束之前结束。 是整个开关/机箱的范围?
Javascript不使用块范围。
因此,所有局部变量都在声明它们的整个函数的范围内。
但是,在您的特定情况下,没有类似C语言(我知道),其中每个case
语句形成一个独立的范围。
例如,以下C#代码将无法编译:
switch(someVar) {
case 1:
int a;
break;
case 2:
int a; //'a' is already defined
break;
}
是整个开关/机箱的范围?
不,它适用于整个包含函数或全局范围(如果您在函数外部)。
(有一些模糊的例子,其中JavaScript引入了额外的范围,但这就是它。)
警告:'i'已经定义
我真的不同意这是一个警告。 我宁愿保留代码,因为块的变量i
独立使用的。
它要你做的是从除第一个声明之外的所有声明中删除var
,或者可以在切换之前添加var i
并从所有for
删除var
。 但是现在这些块并不是孤立的,快速剪切和粘贴(例如,将switch
重构为单独的function
)会留下引用尚未声明为var
的i
循环。 这是一个偶然的全局,它是一个可怕的JS陷阱,这可能是一个真正的调试痛苦。
JSLint提出了同样的抱怨。 我通常会忽略它。 在一个块中声明变量var
两次没有坏处。
即使javascript具有块范围,也存在一种堕落功能,这种功能有点取消了每个case
范围的概念......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.