1. 程式人生 > >js中嚴格模式和非嚴格模式的區別

js中嚴格模式和非嚴格模式的區別

1、在嚴格模式中禁止使用with語句。

2、在嚴格模式中,所有的變數都要先宣告,如果給一個未宣告的變數、函式、函式引數、catch從句引數或全域性物件的屬性賦值,將會丟擲一個引用錯誤(在非嚴格模式中,這種隱式宣告的全域性變數的方法是給全域性物件新新增一個新屬性)。

3、在嚴格模式中,呼叫的函式(不是方法)中的一個this值是undefined。(在非嚴格模式中,呼叫的函式中的this值總是全域性物件)。可以利用這種特性來判斷JavaScript實現是否支援嚴格模式:

var hasStrictMode = (function(){"use strict";return this===undefined;}());

4、同樣,在嚴格模式中,當通過call()或apply()來呼叫函式時,其中的this值就是通過call()或apply()傳入的第一個引數(在非嚴格模式中,null和undefined值被全域性物件和轉換為物件的非物件值所代替)。

5、在嚴格模式中,給只讀屬性賦值和給不可擴充套件的物件建立新成員都將丟擲一個型別錯誤異常(在非嚴格模式中,這些操作只是簡單地操作失敗,不會報錯)。

6、在嚴格模式中,傳入eval()的程式碼不能在呼叫程式所在的上下文中宣告變數或定義函式,而在非嚴格模式中是可以這樣做的。相反,變數和函式的定義是在eval()建立的新作用域中,這個作用域在eval()返回時就棄用了。

7、在嚴格模式中,函式裡的arguments物件擁有傳入函式值的靜態副本。在非嚴格模式中,arguments物件具有“魔術般”的行為,arguments裡的陣列元素和函式引數都是指向同一個值的引用。

8、在嚴格模式中,當delete運算子後跟隨非法的識別符號(比如變數、函式、函式引數)時,將會丟擲一個語法錯誤異常(在非嚴格模式中,這種delete表示式什麼也沒做,並返回false)。

9、在嚴格模式中,試圖刪除一個不可配置的屬性將丟擲一個型別錯誤異常(在非嚴格模式中,delete表示式操作失敗,並返回false)。

10、在嚴格模式中,在一個物件直接量中定義兩個或多個同名屬性將產生一個語法錯誤(在非嚴格模式中不會報錯)。

11、在嚴格模式中,函式宣告中存在兩個或多個同名的引數將產生一個語法錯誤(在非嚴格模式中不會報錯)。

12、在嚴格模式中是不允許使用八進位制整數直接量(以0為字首,而不是0x為字首)的(在非嚴格模式中某些實現是允許八進位制整數直接量的)。

13、在嚴格模式中,識別符號eval和arguments當作關鍵字,他們的值是不能更改的。不能給這些識別符號賦值,也不能把它們宣告為變數、用作函式名、用作函式引數或用作catch塊的識別符號。

14、在嚴格模式中限制了對呼叫棧的檢測能力,在嚴格模式的函式中,arguments.caller和arguments.callee都會丟擲一個型別錯誤異常。嚴格模式的函式同樣具有caller和arguments屬性,當訪問這兩個屬性時將丟擲型別錯誤異常(有一些JavaScript的實現在非嚴格模式裡定義了這些非標準的屬性)。