嚴格模式#
為什么要有嚴格模式
a.消除js語法的一些不合理不嚴謹之處,減少一些怪異行為
b.消除代碼運行的一些不安全之處,保證代碼運行的安全
c.提高編譯器效率,增華運行效率
d.為未來新版本的js 做好鋪墊
嚴格模式需要注意的事項##
1.禁止試用with
語句(with語句無法在編譯時就確定,屬性到底歸屬哪個對象)
2.創設eval
作用域
正常模式下,js語言有兩種變量作用域:全局作用域和函數作用域
嚴格模式創設了eval作用域正常模式下,eval語句的作用域,取決于它處于全局作用域,還是處于函數作用域。
嚴格模式下,eval語句本身就是一個作用域,不再能夠生成全局變量了,它所生成的變量只能用于eval內部。
3.禁止this
關鍵字指向全局對象。
4.禁止在函數內部遍歷調用棧
function f1(){
"use strict"; //進入嚴格模式的標志 PS、老版本瀏覽器會忽略當成普通字符串
f1.caller; // 報錯
f1.arguments; // 報錯
}
5.禁止刪除變量
嚴格模式下無法刪除變量。只有configurable設置為true的對象屬性,才能被刪除。
"use strict";
var x;
delete x; // 語法錯誤
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 刪除成功
6.顯示報錯
正常模式下,對一個對象的只讀屬性進行賦值,不會報錯,只會默默地失敗。嚴格模式下,將報錯。
嚴格模式下,對一個使用getter
方法讀取的屬性進行賦值,會報錯。
嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。
嚴格模式下,刪除一個不可刪除的屬性,會報錯。
7.重名錯誤
正常模式下,如果對象有多個重名屬性,最后賦值的那個屬性會覆蓋前面的值。嚴格模式下,這屬于語法錯誤。
8.函數不能有重名參數
正常模式下,如果函數有多個重名的參數,可以用arguments[i]
讀取。嚴格模式下,這屬于語法錯誤。
9.禁止八進制表示法
10.arguments
對象的限制
(1)不允許對arguments
賦值
(2)arguments
不再追蹤參數的變化
(3)禁止使用arguments.callee
(無法在匿名函數內部調用自身了)
11.函數必須聲明在頂層
"use strict";
if (true) {
function f() { } // 語法錯誤
}
//以上方式雖然不可以但是 可以用另一種方式聲明
if (true) {
var f = function(){
//code
}
}