ECMAScript 版本5是目前最廣泛使用的js版本。
其中的一個重要feature strict mode很多人不是很清除和理解。
什麼是strict mode?
strict mdoe是一種強制js解釋引擎以一種和非stric mode不同的語義的方式來解釋javascript程式碼。執行於script mode的程式碼有以下幾個特徵:
1. 剔除一些句法和語義功能,也就是說,你不能象傳統js那樣隨心所欲
2. 修正部分功能的語義,即:一部分程式碼在strict mode和非strict mode下執行的語義是不同的。
3. 如果有語法或者語義的歧義,在stric mode下直接報出錯誤,而非隱含執行;
4. stric mode僅僅應用於程式碼段,也就是說,你不能將strict mode一次性應用到所有js檔案中,除非你concat所有的js檔案.
stric mode出現的主要白目的是在js開發過程中,強制一些執行時的discipline. 我總是感覺js實在太過靈活,而stric mode就是將這個靈活做以下限制。很多時候之前必須由資深工程師自己注意的tricky部分,那麼現在就由stric mode強加進來了。比如看看下面這段程式碼,你看有什麼問題嗎?實際上"stric mode"下,js引擎就會報錯:
function findProduct(numbers) { "use strict"; var product = 0, len = numbers.length; for(var i = 0; i < len; ++i) { prodct = product * numbers[i]; // ReferenceError: Variable undefined in strict mode } return product; }
瀏覽器支援情況:
幾乎所有的現代瀏覽器都在他們的js引擎中支援strict mode. IE10以上都支援strict mode,
strict mode contexts:
"use strict";
alert("Look ma! Strict mode!");
幾種使能方式:
// global code <script> "use strict"; // global strict mode code here </script> // 2. Eval code: eval("'use strict'; // strict code here"); // or invoked from strict mode code: "use strict"; eval("// strict code here"); // function code: function foo() { "use strict"; // strict code here } // Functions declared in strict mode code inherit the strictness: function foo() { "use strict"; var bar = function () { // strict code here }; bar(); }
strict mode到底有哪些新的限制呢?
1. 標示符必須在他們被賦值前宣告:
2. 對於沒有context的function call不會自動賦予context,比如如果函式被呼叫不給一個obj.method這種方式的話,函式並不會給於this為window物件。
function foo() { // prints "true" print(this === window); } foo(); function foo() { "use strict"; // prints "false" print(this === window); } foo();
3. reserved keywords不能用於標示變數名
"use strict"; var yield; // SyntaxError: Expected identifier
https://blogorama.nerdworks.in/javascriptstrictmoderestrictio/