天天看點

【JS ES6】use strict 嚴格模式

【JS ES6】use strict 嚴格模式

目錄

​​什麼是嚴格模式​​

​​啟用嚴格模式​​

​​嚴格模式中的變化​​

由于 JavaScript 文法不夠嚴謹,一直被人們所诟病,例如在使用一個變量時,可以不使用 var 關鍵字來提前聲明(例如:​

​url = 'http://c.biancheng.net/';​

​),此時 JavaScript 解釋器會自動為您建立這個變量。為了使代碼更加嚴謹,JavaScript 中引入了嚴格模式,一旦使用了嚴格模式,将不再允許使用那些不嚴謹的文法。

什麼是嚴格模式

嚴格模式是在 ECMAScript5(ES5)中引入的,在嚴格模式下,JavaScript 對文法的要求會更加嚴格,一些在正常模式下能夠運作的代碼,在嚴格模式下将不能運作。

添加嚴格模式,主要有以下幾個目的:

  • 消除 JavaScript 文法中一些不合理、不嚴謹的地方;
  • 消除代碼中一些不安全的地方,保證代碼的安全運作;
  • 提高 JavaScript 程式的運作效率;
  • 為以後新版本的 JavaScript 做好鋪墊。

目前,主流浏覽器包括 IE10 及其之後的版本都已支援嚴格模式,JavaScript 正在向着更合理、更安全、更嚴謹的方向發展。

啟用嚴格模式

要啟用嚴格模式,您隻需要在 JavaScript 腳本的開頭添加​

​"use strict";​

​​或​

​'use strict';​

​指令即可,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScript</title>
</head>
<body>
    <script>
        "use strict";
        x = 'http://c.binacheng.net/'; // 此處報錯:Uncaught ReferenceError: x is not defined at index.html:11
        console.log(x);
    </script>
</body>
</html>      

如果将​

​"use strict";​

​​指令添加到 JavaScript 程式的第一行,則表示整個腳本都會處于嚴格模式。如果在函數的第一行代碼中添加​

​"use strict";​

​,則表示隻在該函數中啟用嚴格模式。如下例所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JavaScript</title>
</head>
<body>
    <script>
        x = 'http://c.binacheng.net/';
        console.log(x);
        function sayHello(){
            'use strict';
            str = 'welcome http://c.binacheng.net/'; // 調用 sayHello() 函數在此處報錯:Uncaught ReferenceError: str is not defined at sayHello (index.html:14) at index.html:17
            console.log(str);
        }
        sayHello();
    </script>
</body>
</html>      
注意:​

​"use strict";​

​​或​

​'use strict';​

​指令隻有在整個腳本第一行或者函數第一行時才能被識别,除了 IE9 以及更低的版本外,所有的浏覽器都支援該指令。

嚴格模式中的變化

相對于普通模式來說,嚴格模式對 JavaScript 的文法都做了一些改變。

1、不允許使用未聲明的變量

普通模式下,如果一個變量還沒有聲明,就直接拿來指派,JavaScript 解釋器會自動為您建立這個變量。而在嚴格模式下,則不允許這麼做,所有變量在使用前必須顯式的聲明,否則将會抛出一個 ReferenceError 錯誤。

"use strict";
v = 1;        // 此處報錯:Uncaught ReferenceError: v is not defined
for(i = 0; i < 2; i++) { // 此處報錯:Uncaught ReferenceError: i is not defined
}      

2、不允許删除變量或函數

在嚴格模式下,如果您嘗試删除一個變量或函數,則會抛出文法錯誤。而在普通模式下,雖然不會成功,但并不報錯。

"use strict";
var person = {name: "Peter", age: 28};
delete person;  // 此處報錯:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
function sum(a, b) {
    return a + b;
}
delete sum;  // 此處報錯:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.      

3、函數中不允許有同名的參數

在嚴格模式下,如果函數中有兩個或多個同名參數,則會抛出文法錯誤,而在普通模式下則不會。

"use strict";
function square(a, a) {     // 此處報錯:Uncaught SyntaxError: Duplicate parameter name not allowed in this context
    return a * a;
}      

4、eval 語句的作用域是獨立的

普通模式下,eval 語句的作用域取決于它所在的位置,而在嚴格模式下,eval 語句本身就是一個局部作用域,通過 eval 語句生成的變量隻能在 eval 語句内使用。

"use strict";
eval("var x = 5; console.log(x);");
console.log(x);     // 此處報錯:Uncaught ReferenceError: x is not defined      

5、不允許使用 with 語句

在嚴格模式下,不允許使用 with 語句。

"use strict";
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
var radius2 = 5;
with(Math) {        // 此處報錯:Uncaught SyntaxError: Strict mode code may not include a with statement
    var area2 = PI * radius2 * radius2;
}      

6、不允許寫入隻讀屬性

在嚴格模式下,不允許為隻讀或不存在的屬性指派,否則會造成文法錯誤,而在普通模式下,雖然不會成功,但并不會報錯。

"use strict";
var person = {name: "Peter", age: 28};
Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // 此處報錯:Uncaught TypeError: Cannot assign to read only property 'gender' of object '#<Object>'      

7、不允許使用八進制數

在嚴格模式下,不允許使用八進制數(以零為字首的數字,例如 010、0377),而在普通模式下則可以。

"use strict";
var x = 010; // 此處報錯:Uncaught SyntaxError: Octal literals are not allowed in strict mode.
console.log(parseInt(x));      

8、不能在 if 語句中聲明函數

"use strict";
//如果在if語句中聲明函數,則會産生文法錯誤
if (true) {
    function demo() { // 此處報錯:Uncaught ReferenceError: demo is not defined
        console.log("http://c.biancheng.net/");
    }
}
demo();      
"use strict";
var name = "http://c.biancheng.net/";
function demoTest() {
    console.log(this); 
}
demoTest();      

繼續閱讀