问题描述
我试图了解为什么我得到以下错误,而不是解决方法。
将以下代码传递给JSLint或JSHint会产生错误“'err \”,该错误已被定义。
/*jslint white: true,devel: true,onevar: true,browser: true,undef: true,nomen: true,regexp: true,plusplus: true,windows: true,bitwise: true,newcap: true,strict: true,maxerr: 50,indent: 4 */
function xyzzy() {
\"use strict\";
try { /*Step 1*/ } catch (err) { }
try { /*Step 2*/ } catch (err) { }
}
这里明显的假设是catch
的行为或应该像函数一样。因此,err
既不是全局变量,也不是xyzzy
的局部变量,而是catch
块的参数。
在浏览ECMA-262标准时,描述“ 5”语句的12.14节指示“ 1”子句采用绑定到异常的标识符。另外,“ 1”的语义产生规则指的是传递来的参数,该参数将标识符称为参数。
对于临时读者来说,这似乎暗示上述代码是有效的,并且棉绒工具可能存在错误。
甚至IntelliJ最严格的JavaScript代码检查分析也没有报告重新定义ѭ2的问题。
更令人担忧的是,如果这是一个可变的范围界定问题,那么人们可能会猜测ѭ2正在渗入全球空间,这带来了一系列其他问题,而应该事先声明它,例如:
/*jslint white: true,indent: 4 */
function xyzzy() {
\"use strict\";
var err; // DECLARE err SO IT IS CERTAINLY LOCAL
try { /*Step 1*/ } catch (err) { }
try { /*Step 2*/ } catch (err) { }
}
但是,这现在仅在每个catch语句中导致大约err
的两个错误,这使问题变得更糟,并可能引入可变阴影。
棉绒工具建议每个ѭ1块不仅引入其自身的词法范围,还引入一个新变量。这是不对的。
简单地使用err1
,err2
...来放置静态分析工具仅能掩盖症状,并且不会有助于编写更清晰的代码。
JavaScript Gurus:这是皮棉工具中的错误,JavaScript规范的阴暗角还是对这里发生的事情的根本误解?
更新:写给JSLint的作者道格拉斯·克罗克福德(Douglas Crockford),事实证明,出现此警告的理由很充分。请参阅下面的答案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)