[英]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不會引發錯誤。
正如規范所說:
如果在嚴格模式代碼中對此進行評估,則不會將此值強制轉換為對象。 此 null或undefined值不會轉換為全局對象,並且原始值不會轉換為包裝器對象。 該數值通過一個函數調用(包括使用和Function.prototype.apply的制造Function.prototype.call呼叫)通過不傳遞該值強制為一個對象 ( 10.4.3 , 11.1.1 , 15.3.4.3 , 15.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.