嚴格模式和非嚴格模式區別

嚴格模式和非嚴格模式有什麼區別:函數

嚴格模式對正常的 JavaScript語義作了一些更改。
首先,嚴格模式經過拋出錯誤來消除了一些原有靜默錯誤。
其次,嚴格模式修復了一些致使 JavaScript引擎難以執行優化的缺陷:有時候,相同的代碼,嚴格模式能夠比非嚴格模式下運行得更快。
第三,嚴格模式禁用了在ECMAScript的將來版本中可能會定義的一些語法。

上文引用了MDN對嚴格模式的描述優化


1.變量必須聲明才能使用(在正常模式中,若是一個變量沒有聲明就賦值,默認是全局變量。嚴格模式禁止這種寫法)this

2.禁止使用with語句(由於with語句沒法在編譯時就肯定,屬性到底歸屬於哪一個對象,嚴格模式有利於編譯效率提升)prototype

3.建立eval做用域(正常模式下,js有兩種變量做用域,全局做用域和局部做用域,正常模式下eval語句做用域取決於它處於全局做用域仍是函數做用域,嚴格模式下eval語句自己就是做用域,不可以生成全局變量,所生成的變量只能用於eval內部)code

4.禁止this關鍵字指向全局對象(嚴格模式下全局做用域中定義的函數中的this爲undefined)。例如:對象

function f(){
   return !this; //返回的是false,由於this指向的是全局對象,!對象 == false
 }
 function f(){
   "use strict"
   return !this; //返回的是true,由於嚴格模式下,this的值爲undefined,!undefined == true
 }

5.禁止在函數內部遍歷調用棧( caller:調用當前函數的函數的引用,即外層函數的引用; )ip

function f1(){
    "use strict";
    f1.caller; //報錯
    f1.arguments; //報錯
}
f1();

6.嚴格模式下沒法刪除變量。只有conifgurable設置爲true的對象屬性才能被刪除作用域

"use strict"

var x ;

delete x; //嚴格模式下報語法錯誤

var o = Object.create(null,{'x':{

    value: 1,

    configurable: true

}})

delete o.x; //刪除成功

7.顯示報錯(正常模式下對一個對象的只讀屬性進行賦值,不會報錯,只會默默失敗。嚴格模式下將報錯)get

"use strict";

var o = {};

Object.defineProperty(o,"v",{value: 1,writable: false});

o.v = 2; //報錯,由於o.v屬性是不能被修改的,嚴格模式會報錯,正常模式會失敗但不報錯

8.嚴格模式下,對禁止擴展的對象添加新屬性,會報錯it

"use strict";

var o = {};

Object.preventExtensions(o);//禁止o對象有拓展屬性

o.v = 1; //報錯

9.嚴格模式下,刪除一個不可刪除的屬性,報錯

"use strict";
delete Object.prototype; //報錯

10.對象擁有多個同名屬性,嚴格模式報錯。正常模式會默認值爲最後一個

11.函數不能有重名的參數,嚴格模式會報錯,正常模式能夠經過arguments[i]來獲取對應的參數

12.禁止八進制寫法,正常狀況下整數第一位爲0表明八進制,嚴格模式下整數第一位爲0則報錯

13.不許對arguments賦值

14.嚴格模式下的arguments不在追蹤參數的變化

function fn(a){
    a=2;
    return [a,arguments[0]];
}
fn(1); //正常模式返回值 [2,2]
"use strict"
function fn(a){
    a = 2;
    return [a,arguments[0]];
}
fn(1); //嚴格模式返回值 [2,1] 參數傳進來是多少就是多少,arguments不會變化

15.禁止使用arguments.callee(沒法在匿名函數內部調用自身了。arguments.callee指向的就是該函數自己)

var f = function (){
    return arguments.callee;
}
f(); //報錯

總結:推薦使用嚴格模式,由於能讓代碼更規範,也更利於後期的維護和排除錯誤。更加嚴謹。

相關文章
相關標籤/搜索