繁体   English   中英

switch / case语句中的JavaScript变量范围是什么?

[英]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 )会留下引用尚未声明为vari循环。 这是一个偶然的全局,它是一个可怕的JS陷阱,这可能是一个真正的调试痛苦。

JSLint提出了同样的抱怨。 我通常会忽略它。 在一个块中声明变量var两次没有坏处。

即使javascript具有块范围,也存在一种堕落功能,这种功能有点取消了每个case范围的概念......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM