嚴格模式
:使用嚴格模式的好處是能夠提前知道代碼中存在的錯誤,及時捕獲一些可能致使編程錯誤的 ECMAScript 行爲。javascript
嚴格模式的編譯指示(pragma): "use strict";
,支持嚴格模式的引擎會啓動這種模式,而不支持該模式的引擎就當遇到了一個未賦值的字符串字面量,會忽略這個編譯指示。java
function test () {
"use strict";
...
}
複製代碼
// 未聲明變量
// 非嚴格模式:建立全局變量
// 嚴格模式:拋出 ReferenceError
message = "Hello world! ";
複製代碼
//刪除變量
//非嚴格模式:靜默失敗
//嚴格模式:拋出 ReferenceError
var color = "red";
delete color;
複製代碼
// 重名屬性
// 非嚴格模式:沒有錯誤,以第二個屬性爲準
// 嚴格模式:拋出語法錯誤
var person = {
name: "Nicholas",
name: "Greg"
};
複製代碼
//重名參數
//非嚴格模式:沒有錯誤,只能訪問第二個參數
//嚴格模式:拋出語法錯誤
function sum (num, num){
// todo
}
複製代碼
//修改命名參數的值
//非嚴格模式:修改會反映到 arguments 中
//嚴格模式:修改不會反映到 arguments 中
function showValue(value) {
value = "Foo";
console.log(value); //"Foo"
console.log(arguments[0]); //非嚴格模式:"Foo",嚴格模式:"Hi"
}
showValue("Hi");
複製代碼
//訪問 arguments.callee
//非嚴格模式:沒有問題
//嚴格模式:拋出 TypeError
function factorial(num){
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
var result=factorial(5);
複製代碼
//在 if 語句中聲明函數
//非嚴格模式:將函數提高到 if 語句外部
//嚴格模式:拋出語法錯誤
if (true){
function doSomething(){
// todo
}
}
複製代碼
//使用 eval()建立變量
//非嚴格模式:彈出對話框顯示 10
//嚴格模式:調用 alert(x)時會拋出 ReferenceError
function doSomething(){
eval("var x=10");
alert(x);
}
複製代碼
"use strict";
var result = eval("var x=10, y=11; x+y");
alert(result); // 21
複製代碼
嚴格模式已經明確禁止使用 eval 和 arguments 做爲標識符,也不容許讀寫它們的值。編程
// 把 eval 和 arguments 做爲變量引用
// 非嚴格模式: 沒問題,不出錯
// 嚴格模式: 拋出語法錯誤
var eval = 10;
var arguments = "Hello world!";
複製代碼
在非嚴格模式下使用函數的 apply()或 call()方法時,null 或 undefined 值會被轉換爲全局 對象。而在嚴格模式下,函數的 this 值始終是指定的值,不管指定的是什麼值。app
// 訪問屬性
// 非嚴格模式: 傳入null, 函數的this值是全局對象
// 嚴格模式: 拋出錯誤,由於this的值爲 null
var color = "red";
function displayColor(){
alert(this.color);
}
displayColor.call(null);
複製代碼
//with 的語句用法
//非嚴格模式:容許
//嚴格模式:拋出語法錯誤
with(location){
alert(href);
}
複製代碼
//使用八進制字面量
//非嚴格模式:值爲 8
//嚴格模式:拋出語法錯誤
var value = 010;
複製代碼
//使用 parseInt()解析八進制字面量
//非嚴格模式:值爲 8
//嚴格模式:值爲 10
var value = parseInt("010");
複製代碼