JavaScript語法支持嚴格模式:”use strict”


如果給JavaScript代碼標志為“嚴格模式”,則其中運行的所有代碼都必然是嚴格模式下的。 其一:如果在語法檢測時發現語法問題,則整個代碼塊失效,並導致一個語法異常。 其二:如果在運行期出現了違反嚴格模式的代碼,則拋出執行異常。

注:經過測試IE6,7,8,9均不支持嚴格模式。

JavaScript代碼“嚴格模式”使用方法: 嚴格模式需要使用字符串序列:

 

"use strict"

 

在如下位置加入可以開啟相應代碼塊中的嚴格模式: 1.必須在全局代碼的開始處加入。 2.在eval代碼開始處加入。 3.在函數聲明代碼開始處加入。 4.在new Function()所傳入的body參數塊開始加入。

例1:

 

var num =012;alert(num);

 

在非嚴格模式下,可以使用0(零)開頭前綴聲明8進制。顯示10。

但是在嚴格模式下,會產生錯誤。

 

"use strict";

var num =012;

alert(num);

 

測試結果: IE6,7,8,9均顯示10。 FF報錯:octal literals and octal escape sequences are deprecated Chrome報錯:Uncaught SyntaxError: Octal literals are not allowed in strict mode. Opera報錯:Syntax error at line 3 while loading: Invalid character var num = 012;

如果使用嚴格模式,除了0(零)開頭前綴8進制以外還有: 1.在代碼中不能使用一些擴展的保留字: implements,interface,let,package,private,public,static,yield 2.with語句也不能使用。 3.不能聲明或重寫eval和arguments兩個標識符。 4.不能用delete 刪除顯式聲明的標識符,名稱或具名函數。

 

來源:http://qianduan-notes.diandian.com/post/2012-06-02/40027620460

 

嚴格(Strict)模式

新規范中的一個有趣部分是嚴格模式的引入。嚴格模式是一種許可式(opt-in)機制,允許開發人員使用 JavaScript 語言的一個有限但更整潔的子集。根據 Doug Crockford 的精神,嚴格模式旨在修復或限制該語言的一些劣跡斑斑的 “壞部分”。

嚴格模式可以在腳本或函數級別實現。這很不錯,因為它允許模塊和庫作者選擇編寫嚴格代碼,而不會影響環境的其余部分。有一點需要牢記:由於性能因素連接嚴格和非嚴格腳本可能會導致意想不到的結果。

要在腳本級別激活嚴格模式,可以在文件中所有其他語句之前包含語句 use strict。清單 1 展示了一個示例。


清單 1. 在腳本級別激活嚴格模式

				
"use strict";
var myNamespace = {
    myMethod : function(){
    	//strict code
	}
}

 

在函數級別激活嚴格模式的方法類似:在函數主體中的其他任何語句之前包含語句 use strict,如清單 2 所示。


清單 2. 在函數級別激活嚴格模式

				
function getStrict(){
	"use strict";
	//strict code
}

 

有一點很有趣,應引起注意:用於激活嚴格模式的語法只是一個字符串表達式語句,這意味着,現在在您的代碼中包含該語句本身並不會帶來什么壞處。理解它的瀏覽器會打開該子集。不理解它的瀏覽器將會將其視為一個表達式語句,忽略它,然后繼續處理下一行代碼。當然,如果只有少數幾個瀏覽器支持嚴格模式,激活嚴格模式可能會導致其他問題,但 Use Strict 指令本身不是其中之一。


嚴格模式實戰

下面幾個小節簡單展示嚴格模式在您的代碼上的效果。盡管這不是對嚴格模式的每個方面的全面檢查,但這些示例展示了這個新模式的主要特征。理解嚴格模式的最好方法是在一個支持嚴格模式的瀏覽器中試用這些示例。

如果足夠大膽,您可以將這條指令放到您的一個現有腳本的頂端,看看會導致多少錯誤(或者沒有錯誤,如果您已經小心翼翼地避免了這些陷阱的話)。

繁雜的錯誤和意外全局變量之死

嚴格模式中我特別喜歡的一個部分,看起來就像代碼審查中的一些挑剔部分。嚴格模式將標准腳本中通常會忽略或靜默失敗的幾種常見負面編碼模式轉變為實際錯誤。最常見的一種模式是向一個沒有使用 var 語句聲明的未聲明變量分配一個值,意外創建一個全局變量。在標准代碼中,這只是一種不良實踐。在嚴格模式中,將拋出一個引用錯誤,如清單 3 所示。


清單 3. 禁止意外全局變量

				
function nopullution(){
	"use strict";
	myAccidentalGlobal = "polluting the global namespace is for losers";
}
nopullution();
>>>Error: assignment to undeclared variable myAccidentalGlobal

 

在某些情況下,可以通過更改 this 關鍵字的綁定方式來防止意外全局變量。例如,如果一個構造器函數被直接調用,而不是使用新前綴,this 將被綁定到全局對象。在這種情況下,嚴格模式將 this 綁定到 undefined,防止意外破壞全局名稱空間。

另外,原來只會靜默失敗的動作(比如刪除一個不可刪除的屬性或重復參數或屬性名稱)現在會拋出錯誤。清單 4 展示了一些示例。


清單 4. 繁雜的錯誤

				
"use strict"
delete Array.prototype;

>>>Error: property "use strict";Array.prototype is non-configurable and
can't be deleted
"use strict"
var myObj ={
        dupe: 1,
        dupe :2
}
>>>Error: property name dupe appears more than once in object literal

 來源:http://www.ibm.com/developerworks/cn/web/wa-ecma262/index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM