在使用 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;
}
我认为作用域以每个中断语句结束,但似乎作用域直到 switch/case 结束才结束。范围是整个开关/外壳吗?
来自MDN 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch#lexical_scoping: "The case
and default
子句不创建词法范围。”
因此,在 a 内声明的所有变量switch
声明,生活在同一范围内。使用声明变量let/const
与抛出错误同名。
switch(someVar) {
case 1:
let a;
break;
case 2:
let a; // Uncaught SyntaxError: Identifier 'a' has already been declared
break;
}
如果你想在一个内部创建一个单独的(嵌套的)块作用域case
子句,您可以使用labels
:
switch(someVar) {
case 1: { // <- creates a new block scope
let a;
break;
}
case 2: { // <- creates a new block scope
let a;
break;
}
}
据我所知,没有一种类似 C 的语言可以使每个case
声明形成一个独立的范围。
例如,以下 C# 代码也将无法编译:
switch(someVar) {
case 1:
int a;
break;
case 2:
int a; // 'a' is already defined
break;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)