天天看點

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為字首)的(在非嚴格模式中某些實作是允許八進制整數直接量的)。