Fél*_*lli 8 javascript strict use-strict ecmascript-5
是的,是的,我知道,严格模式还没有,但实际上,我正在为未来做准备......
那么,为什么这样:
$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
Run Code Online (Sandbox Code Playgroud)
...在ES5严格模式下不允许?
还是我误解了?JSLint的:
Problem at line 516 character 18: Strict violation.
可能会更冗长一点,我想......?
编辑:
为避免混淆,这里有更多的原始代码:
function displayLegend() {
$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
}
Run Code Online (Sandbox Code Playgroud)
JSLint中此代码的一些试错
"use strict";
var that="dd";
function $(x){return x;}
$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);
Run Code Online (Sandbox Code Playgroud)
告诉我出了什么问题:你this用作参数.将thises转换为thats不会触发错误.
正如规范所说:
如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象.甲此的值无效或未定义的不转换为全局对象和原始值不被转换为包装器的对象.在这个值通过一个函数调用(包括使用的呼叫传递Function.prototype.apply的和Function.prototype.call)不传递强制这个值的一个对象(10.4.3,11.1.1,15.3.4.3,15.3. 4.4).[我的重点]
正如John Resig 所写,
最后,一个长期(并且非常烦人)的错误已经解决:将null或undefined强制转换为全局对象的情况.严格模式现在可以防止这种情况发生并引发异常.
Run Code Online (Sandbox Code Playgroud)(function(){ ... }).call( null ); // Exception
如您所示,在函数声明中使用您的代码行会在JSLint中引发错误,而在函数表达式中使用它则不会.看起来JSLint错误地解析了函数声明,看到this那时仍未定义,并抛出异常.
在这一点上,我想我必须引用Juriy Zaytsev('kangax'):
真的有关系吗?
很高兴理解严格模式不是必需的,但仅仅是一种选择.它为那些需要它的人提供更严格的规则,并且愿意应对(并享受)后果.
更新:最后我找到了解释.如果您阅读此主题,特别是从#1512开始,您将阅读该内容
ES5/strict的要点是禁止泄漏全局对象,这是ES3滥用的东西.ES5/strict动态地完成了一些工作,其中一些工作是静态的.JSLint静态地完成所有工作,因此它必须更加严格,以便最好地帮助您正确地完成您的程序.[Douglas Crockford在#1553]
我必须承认他在这里有一个有用的观点:如果你的目标是避免全局命名空间污染,你不应该使用函数声明,而是使用私有命名空间内的函数表达式.但我同意在提到的线程中的其他人,错误消息应该更明确(并可能在遇到函数声明时抛出警告).
| 归档时间: |
|
| 查看次数: |
4045 次 |
| 最近记录: |