JavaScript 嚴格模式(use strict)

JavaScript 嚴格模式(strict mode)即在嚴格的條件下運行。javascript


使用 "use strict" 指令

"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。php

它不是一條語句,可是是一個字面量表達式,在 JavaScript 舊版本中會被忽略。html

"use strict" 的目的是指定代碼在嚴格條件下執行。前端

嚴格模式下你不能使用未聲明的變量。java


Note 支持嚴格模式的瀏覽器:
Internet Explorer 10 +、 Firefox 4+ Chrome 13+、 Safari 5.1+、 Opera 12+。

嚴格模式聲明

嚴格模式經過在腳本或函數的頭部添加 "use strict"; 表達式來聲明。程序員

實例中咱們能夠在瀏覽器按下 F12 (或點擊"工具>更多工具>開發者工具") 開啓調試模式,查看報錯信息。web

Gif 圖演示以下:express

實例

"use strict";
x = 3.14;       // 報錯 (x 未定義)

嘗試一下 »

實例

"use strict";
myFunction();

function myFunction() {
    y = 3.14;   // 報錯 (y 未定義)
}

嘗試一下 »

在函數內部聲明是局部做用域 (只在函數內使用嚴格模式):瀏覽器

實例

x = 3.14;       // 不報錯
myFunction();

function myFunction() {
   "use strict";
    y = 3.14;   // 報錯 (y 未定義)
}

嘗試一下 »

爲何使用嚴格模式:安全

    消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
  • 消除代碼運行的一些不安全之處,保證代碼運行的安全;
  • 提升編譯器效率,增長運行速度;
  • 爲將來新版本的Javascript作好鋪墊。

"嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向,包括IE 10在內的主流瀏覽器,都已經支持它,許多大項目已經開始全面擁抱它。

另外一方面,一樣的代碼,在"嚴格模式"中,可能會有不同的運行結果;一些在"正常模式"下能夠運行的語句,在"嚴格模式"下將不能運行。掌握這些內容,有助於更細緻深刻地理解Javascript,讓你變成一個更好的程序員。


嚴格模式的限制

不容許使用未聲明的變量:

"use strict";
x = 3.14;                // 報錯 (x 未定義)

嘗試一下 »
Note 對象也是一個變量。

"use strict";
x = {p1:10, p2:20};      // 報錯 (x 未定義)

嘗試一下 »

不容許刪除變量或對象。

"use strict";
var x = 3.14;
delete x;                // 報錯

嘗試一下 »

不容許刪除函數。

"use strict";
function x(p1, p2) {};
delete x;                // 報錯 

嘗試一下 »

不容許變量重名:

"use strict";
function x(p1, p1) {};   // 報錯

嘗試一下 »

不容許使用八進制:

"use strict";
var x = 010;             // 報錯

嘗試一下 »

不容許使用轉義字符:

"use strict";
var x = \010;            // 報錯

嘗試一下 »

不容許對只讀屬性賦值:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // 報錯

嘗試一下 »

不容許對一個使用getter方法讀取的屬性進行賦值

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;            // 報錯

嘗試一下 »

不容許刪除一個不容許刪除的屬性:

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

嘗試一下 »

變量名不能使用 "eval" 字符串:

"use strict";
var eval = 3.14;         // 報錯

嘗試一下 »

變量名不能使用 "arguments" 字符串:

"use strict";
var arguments = 3.14;    // 報錯

嘗試一下 »

不容許使用如下這種語句:

"use strict";
with (Math){x = cos(2)}; // 報錯

嘗試一下 »

因爲一些安全緣由,在做用域 eval() 建立的變量不能被調用:

"use strict";
eval ("var x = 2");
alert (x);               // 報錯

嘗試一下 »

禁止this關鍵字指向全局對象。

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

所以,使用構造函數時,若是忘了加new,this再也不指向全局對象,而是報錯。

function f(){     "use strict";     this.a = 1; }; f();// 報錯,this未定義

保留關鍵字

爲了向未來Javascript的新版本過渡,嚴格模式新增了一些保留關鍵字:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // 報錯

嘗試一下 »

Note "use strict" 指令只容許出如今腳本或函數的開頭。