繁体   English   中英

为什么在严格模式下这是非法的?

[英]Why is this illegal in strict mode?

是的,是的,我知道,严格模式还没有,但实际上,我正在为未来做准备......

那么,为什么这样:

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();

...在ES5严格模式下不允许?

还是我误解了? JSLint的:

Problem at line 516 character 18: Strict violation.

可能会更冗长一点,我想......?

编辑:

为避免混淆,这里有更多的原始代码:

function displayLegend() {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
}

JSLint中此代码的一些试错

"use strict";
var that="dd";
function $(x){return x;}

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);

向我展示了什么是错的:你将this用作参数。 同时更改this下载到that S不会引发错误。

正如规范所说:

如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象。 nullundefined值不会转换为全局对象,并且原始值不会转换为包装器对象。 数值通过一个函数调用(包括使用和Function.prototype.apply的制造Function.prototype.call呼叫)通过不传递值强制为一个对象10.4.311.1.115.3.4.315.3。 4.4 )。 [我的重点]

正如John Resig 所写

最后,一个长期(并且非常烦人)的错误已经解决:将null或undefined强制转换为全局对象的情况。 严格模式现在可以防止这种情况发生并引发异常。

 (function(){ ... }).call( null ); // Exception 

如您所示,在函数声明中使用您的代码行会在JSLint中引发错误,而在函数表达式中使用它则不会。 看起来JSLint错误地解析了函数声明,看到了this ,那时仍未定义,并抛出异常。

在这一点上,我想我必须引用Juriy Zaytsev('kangax')

真的有关系吗?

很高兴理解严格模式不是必需的 ,但仅仅是一种选择。 它为那些需要它的人提供更严格的规则,并且愿意应对(并享受)后果。


更新:最后我找到了解释。 如果您阅读此主题 ,特别是从#1512开始,您将阅读该内容

ES5 / strict的要点是禁止泄漏全局对象,这是ES3滥用的东西。 ES5 / strict动态地完成了一些工作,其中一些工作是静态的。 JSLint静态地完成所有工作,因此它必须更加严格,以便最好地帮助您正确地完成您的程序。 [Douglas Crockford在#1553]

我不得不承认他在这里有一个有用的观点:如果你的目标是避免全局命名空间污染,你不应该使用函数声明,而是使用私有命名空间内的函数表达式。 但我同意在提到的线程中的其他人,错误消息应该更明确(并可能在遇到函数声明时抛出警告)。

按照David Dorward的说法,我发现了一些通过JSLint测试的东西。 对于它为什么这样做,这是完全奇怪的。

之前:(见问题)

后:

var displayLegend = function () {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
};

编辑:

我问Douglas Crockford:

JSLint只允许在严格模式下使用明显打算作为方法调用的函数。 所以写

 object.property = function () { ... this ... }; 

这证实了它在规范中所说的内容,除了它更加清晰!

暂无
暂无

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

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