"use strict"嚴格模式

「use strict」嚴格模式是ECMAScript 5引入的一條指令,使用"use strict"指令的目的是說明(腳本或函數中)後續的代碼將會解析爲嚴格代碼(strict code)!app

一,"use strict"指令和普通語句之間的區別

  • 它不包含任何語言的關鍵字,指令僅僅是一個包含一個特殊字符串直接量的表達式(能夠是使用單引號也可使用雙引號),對於那些沒有實現ECMAScript 5的JavaScript解釋器來講,它只是一條沒有反作用的表達式語句,它什麼也沒作。未來的ECMAScript標準但願將use用作關鍵字,這樣就能夠省略引號了。
  • 它只能出如今腳本代碼的開始或者函數體的開始、任何實體語句以前。但它沒必要必定出如今腳本的首行或函數體內的首行,由於"use strict"指令以後或以前均可能有其餘字符串直接量表達式語句,而且JavaScript的具體實現可能將它們解析爲解釋器自有的指令。在腳本或者函數體內第一條常規語句以後字符串直接量表達式語句只當作普通的表達式語句對待;它們不會當作指令解析,它們也沒有任何反作用。

二,嚴格模式和非嚴格模式之間的區別(前三條尤其重要)

  • 在嚴格模式中禁止使用with語句。
var name = "Andy";
    with(name) {
        console.log(name);  	//輸出 "Andy"
    }
複製代碼
  • 在嚴格模式中,全部的變量都要先聲明,若是給一個未聲明的變量、函數、函數參數、catch從句參數或全局對象的屬性賦值,將會拋出一個引用錯誤異常。
 "use strict";
    x = 6.66;       // 報錯 (x is not defined)
複製代碼
  • 在嚴格模式中,調用的函數(不是方法)中的一個this值是undefined。(在非嚴格模式中,調用的函數中的this值老是全局對象)。能夠利用這種特性來判斷JavaScript實現是否支持嚴格模式。
 "use strict"
    function fun() {
        console.log(this);
    }
    fun();  // undefined
複製代碼
  • 一樣,在嚴格模式中,當經過call()或apply()來調用函數時,其中的this值就是經過call()或apply()傳入的第一個參數(在非嚴格模式中,null和undefined值被全局對象和轉換爲對象的非對象值所代替)。
  • 在嚴格模式中,給只讀屬性賦值和給不可擴展的對象建立新成員都將拋出一個類型錯誤異常(在非嚴格模式中,這些操做只是簡單地操做失敗,不會報錯)。
 "use strict";
    var obj = {};
    Object.defineProperty(obj, "x", {value:0, writable:false});
    obj.x = 3.14;       // 報錯
複製代碼
  • 在嚴格模式中,傳入eval()的代碼不能在調用程序所在的上下文中聲明變量或定義函數,而在非嚴格模式中是能夠這樣作的。相反,變量和函數的定義是在eval()建立的新做用域中,這個做用域在eval()返回時就棄用了。
  • 在嚴格模式中,當delete運算符後跟隨非法的標識符(好比變量、函數、函數參數)時,將會拋出一個語法錯誤異常(在非嚴格模式中,這種delete表達式什麼也沒作,並返回false)。
 "use strict";
    function fun(p1, p2) {}; 
    delete fun;     // 報錯 
複製代碼
  • 在嚴格模式中,在一個對象直接量中定義兩個或多個同名屬性將產生一個語法錯誤(在非嚴格模式中不會報錯)。
  • 在嚴格模式中,函數聲明中存在兩個或多個同名的參數將產生一個語法錯誤(在非嚴格模式中不會報錯)。
  • 在嚴格模式中是不容許使用八進制整數直接量(以0爲前綴,而不是0x爲前綴)的(在非嚴格模式中某些實現是容許八進制整數直接量的)。
 "use strict";
    var x = 010;    // 報錯
複製代碼
  • 在嚴格模式中,標識符eval和arguments當作關鍵字,它們的值是不能更改的。不能給這些標識符賦值,也不能把它們聲明爲變量、用作函數名、用作函數參數或用作catch塊的標識符。
  • 在嚴格模式中限制了對調用棧的檢測能力,在嚴格模式的函數中,arguments.caller和arguments.callee都會拋出一個類型錯誤異常。嚴格模式的函數一樣具備caller和arguments屬性,當訪問這兩個屬性時將拋出類型錯誤異常(有一些JavaScript的實如今非嚴格模式裏定義了這些非標準的屬性)。
相關文章
相關標籤/搜索