javascript strict mode

世有因果知因求果發表於2018-05-06

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/

相關文章