严格模式是什么?
ES5 的严格模式是采用具有限制性JavaScript变体的一种方式,它的产生是为了形成与正常代码不同的语义。
推出严格模式的目的
- 严格模式通过抛出错误来消除了一些原有静默错误。
- 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
- 为未来新版本 JS 做铺垫。
如何使用严格模式
1. 全局使用
<script>
"use strict";
function fn() {
//xxxxxxxxxxx
}
</script>
2. 函数局部使用
<script>
function fn() {
"use strict";
//xxxx
}
</script>
并不建议全局使用,这样不利于文件的合并,我们可以采用立即执行的匿名函数达到全局的效果,但又不污染全局
(funciton(){
"use strict";
})();
严格模式下的一些特性
1. 在普通模式下,变量如果未声明就赋值,则默认为全局变量。而严格模式下则直接报错。即变量都需要(let/var/const)显式声明
<script>
(function(){
a = "a"
console.log(a); //===> a
})();
(function(){
"use strict";
b = "b"
console.log(b); //===> Uncaught ReferenceError: b is not defined
})();
</script>
2. 严格模式下抛出一些静默的失败,例如给不可写、只读属性赋值等
<script>
(function(){
var obj = {
name: "obj"
}
Object.freeze(obj);
obj.name = "changeObj";
console.log(obj.name); //===> obj
})();
(function(){
"use strict";
var obj = {
name: "obj"
}
Object.freeze(obj);
obj.name = "changeObj";
//===> Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
console.log(obj.name);
})();
</script>
3. 严格模式下 this 全局作用域下的函数默认值是 undefined
<script>
(function() {
console.log(this); //===> Window
})();
(function() {
"use strict";
console.log(this); //===> undefined
})();
</script>
<script>
"use strict";
console.log(this); //===> Window
(function() {
console.log(this); //===> undefined
})();
</script>
4. 禁止参数,对象属性重名和八进制
<script>
(function() {
var obj = {
name: "obj",
name: "obj_name"
}
function fn(a, b, b) {
return { a,b }
}
console.log(obj); //===> {name: "obj_name"}
console.log(fn(1,2,3)); //===> {a:1, b:3}
})();
(function() {
"use strict";
var obj = {
name: "obj",
name: "obj_name"
}
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context
function fn(a, b, b) {
return { a,b };
}
console.log(obj); //Uncaught SyntaxError: Duplicate parameter name not allowed in this context
console.log(fn(1,2,3));
console.log(0100); //Uncaught SyntaxError: Octal literals are not allowed in strict mode
})();
</script>
5. 严格模式下 具名参数是 arguments 的静态副本而非普通模式下的引用
<script>
(function(){
function fn(name) {
name = "fn_name";
console.log(name); //===> fn_name
console.log(arguments[0]); //===> fn_name
}
fn("name");
})();
(function(){
"use strict";
function fn(name) {
name = "fn_name";
console.log(name); //===> fn_name
console.log(arguments[0]); //===> name
}
fn("name");
})();
</script>
网友评论