目錄
什麼是嚴格模式
啟用嚴格模式
嚴格模式中的變化
由于 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";
指令隻有在整個腳本第一行或者函數第一行時才能被識别,除了 IE9 以及更低的版本外,所有的浏覽器都支援該指令。
'use strict';
嚴格模式中的變化
相對于普通模式來說,嚴格模式對 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();