爲什麼使用嚴格模式?
-
消除js語法的一些不合理、不嚴謹之處,減少一些怪異行爲;
1).消除代碼運行的一下不安全之處,保證代碼運行的安全;
2).提高編譯器效率,增加運行速度;
3)爲未來新版本的js做好鋪墊。
-
“嚴格模式”提現了js更合理、更安全、更嚴謹的發展方向,包括IE10在內的主流瀏覽器,都已經支持它,許多大項目已經開始全面擁抱它。
-
另一方面,同樣的代碼,在“嚴禁模式”中,可能會有不一樣的運行結果;一些在“正常模式”下可以運行的語句,在“嚴禁模式”下將不能運行。掌握這些內容,有助於更細緻深入地理解js,讓你成爲更好的程序員。
嚴格模式其指令出現的位置
- 直接寫在
<script></script>
中的第一行;(表示該篇js都處於嚴格模式下) - 寫在方法中的第一行;(表示該方法下的代碼格式都處於嚴格模式)
<script>
"use strict"
// 以下的所有代碼都處於嚴格模式
</script>
<script>
function foo(){
"use strict"
//該方法下的代碼處於嚴格模式
}
</script>
嚴格模式下,不能使用未聲明的變量
<script>
// 嚴格模式
"use strict"
x=123; //報錯( Uncaught ReferenceError: x is not defined)
</script>
<script>
// 非嚴格模式
x=123;
console.log(x) //輸出:123
</script>
<script>
// 嚴格及非嚴格模式
x=123;
console.log(x) //輸出:123
foo(); //Uncaught ReferenceError: y is not defined
function foo(){
"use strict"
y=234; //報錯,y未定義
}
</script>
嚴格模式下,不允許刪除 變量或對象 (強調:只有configurable設置爲true的對象屬性,才能被刪除。)
<script>
"use strict";
var x = 123;
delete x; // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
</script>
<script>
"use strict";
var x;
// 第一種:
delete x; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
//第二種:
var o = Object.create(null, {
'x':{
value:1234,
configurable:true
}
});
console.log(o.x) //輸出:1234
delete o.x; //刪除成功
console.log(o.x) //輸出:undefined
</script>
嚴格模式下,不允許刪除函數
<script>
"use strict";
function foo(p1,p2){}
delete foo; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
</script>
嚴格模式下,函數不允許參數名相同
<script>
function a(a1, a1) {
console.log(a1, a1)
}
a(1,3) // 3 3
</script>
<script>
"use strict";
function a(a1, a1) { // SyntaxError: Duplicate parameter name not allowed in this context
console.log(a1, a1)
}
</script>
嚴格模式下,不允許使用八進制
<script>
"use strict";
var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode.
</script>
嚴格模式下,不允許對只讀屬性賦值
<script>
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {
value: 0,
writable: false
});
obj.x = 3.14; //Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'
</script>
嚴格模式下,不允許對一個使用getter方法讀取的屬性進行賦值
<script>
"use strict";
var obj = {
get x() {
return 0
}
};
obj.x = 3.14; //Uncaught TypeError: Cannot set property x of #<Object> which has only a getter
</script>
嚴格模式下,不允許刪除一個不允許刪除的屬性
<script>
"use strict";
delete Object.prototype; //Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }(不能刪除函數對象()的屬性“原型”{ [本機代碼] })
</script>
嚴格模式下,變量名不能使用 “eval” 字符串
<script>
//嚴格模式下
"use strict";
var eval = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(嚴格模式下的意外EVE或參數)
console.log(eval)
</script>
<script>
//非嚴格模式下
var eval = 3.14;
console.log(eval) //3.14
</script>
嚴格模式下,變量名不能使用 “arguments” 字符串
<script>
// 嚴格模式下
"use strict";
var arguments = 3.14; //Uncaught SyntaxError: Unexpected eval or arguments in strict mode(嚴格模式下的意外EVE或參數)
console.log(arguments)
</script>
<script>
// 非嚴格模式下
var arguments = 3.14;
console.log(arguments) //3.14
</script>
嚴格模式下,不允許使用以下這種語句
<script>
"use strict"
with(Math) {
x = cos(2)
}; //Uncaught SyntaxError: Strict mode code may not include a with statement
</script>
嚴格模式下,由於一些安全原因,在作用域 eval() 創建的變量不能被調用
<script>
"use strict"
eval ("var x = 2");
alert (x); // Uncaught ReferenceError: x is not defined
</script>