JSLint中这段代码的一些试错
"use strict";
var that="dd";
function $(x){return x;}
$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);
告诉我出了什么问题:您正在this
用作参数。将两个this
es 都更改为that
s 不会触发错误。
正如规范所说:
如果this在严格模式代码中进行评估,则this值不会被强制转换为对象。null或undefined的this值不会转换为全局对象,原始值也不会转换为包装器对象。通过函数调用传递的this值(包括使用Function.prototype.apply和Function.prototype.call进行的调用)不会将传递的this值强制传递给对象(10.4.3、11.1.1、15.3.4.3、15.3。 4.4 )。[我的重点]
正如约翰雷西格所写,
最后,解决了一个长期存在的(并且非常烦人的)错误:null 或 undefined 被强制成为全局对象的情况。严格模式现在可以防止这种情况发生并引发异常。
(function(){ ... }).call( null ); // Exception
正如您所展示的,在函数声明中使用您的代码行会在 JSLint 中引发错误,而在函数表达式中使用它不会。看起来 JSLint 错误地解析了函数声明,看到this
在那一刻仍然未定义,并引发异常。
在这一点上,我想我必须引用Juriy Zaytsev ('kangax') 的话:
真的有关系吗?
很高兴了解严格模式不是必需的,而只是一种选择。它为那些需要它并愿意应对(并享受)后果的人提供更严格的规则。
更新:最后我找到了解释。如果您阅读此线程,尤其是从消息 #1512 开始,您会阅读到
ES5/strict 的重点是禁止泄漏全局对象,这是 ES3 混杂做的事情。ES5/strict 的一些工作是动态的,而它的一些工作是静态的。JSLint 以静态方式完成所有工作,因此它必须更加严格,才能最好地帮助您正确编写程序。[#1553 中的道格拉斯·克罗克福德]
我不得不承认他有一个正确的观点:如果你的目标是避免全局命名空间污染,那么无论如何你不应该使用函数声明,而应该使用私有命名空间内的函数表达式。但我同意上述线程中的其他人的观点,即错误消息应该更明确(并且可能在遇到函数声明时发出警告)。