簡體   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