一、概念
JavaScript 的严格模式是 ES5 引入的(ES6 默认使用严格模式),使用方法很简单,只需要在头部加上"use strict"; 即可,严格模式是对 sloppy 模式(懒散模式)的一种限制性使用。
二、特点
- 各浏览器对严格模式的处理不同,使用严格模式得到的结果可能也不尽相同;
- 代码合并时,严格模式与非严格模式合并后可能引发冲突;
- 严格模式和非严格模式可以共存,所以项目中可以渐进式的采用严格模式。
三、应用
1. 禁止使用未申明的变量
"use strict";
console.log(a);//引用错误(ReferenceError)
a = 1;
2. 禁止使用 with 函数
with 函数的作用是直接使用对象的属性或方法而不用复写对象。
"use strict";
var obj = {id:10};
var id = 12;
with(obj){//报错
console.log(id);
// 如果没有开启严格模式,with 中的这个 id 会指向 with 上面的那个 id,还是obj.id?
// 如果不运行代码,无法知道,因此,这种代码让引擎无法进行优化,速度也就会变慢。
};
3. 禁止使用 arguments.callee
"use strict";
function person(){
console.log(arguments.callee)//报错
};
person(1);
//arguments.callee 非严格模式下指向正在指向的函数
4. 禁止使用同名的参数
"use strict";
function person(a,a,b){//报错
console.log(a+a+b);
};
person(1,2,3);
//非严格模式下后面的参数覆盖前面的,即2+2+3=7;
5. 禁止给原始值添加属性
"use strict";
false.a = 1;//类型错误(TypeError)
6. 禁止删除不可删除的属性
"use strict";
delete Object.prototype;//类型错误(TypeError)
7. 禁止删除申明变量
"use strict";
var x;
delete x;;//语法错误(SyntaxError)
8. 禁止自动创建全局变量
"use strict";
x = 20;
console.log(x);//引用错误(ReferenceError)
//非严格模式下会自动创建一个全局变量,即结果为 20;
9. 禁止使用保留关键字作为变量名或形参名
"use strict";
var public;//语法错误(SyntaxError)
function person(public){
//语法错误(SyntaxError)
}
10. 禁止以0开头来表示八进制,可以以"0o"开头
"use strict";
var x = 010;//语法错误(SyntaxError)
//非严格模式下可以以0开头;
11. 禁止了不在脚本或者函数层面上的函数申明
"use strict";
if(true){
function person(){}
}//报错
function person(){
function animal(){}
}//不报错
12. 在函数作用域内给参数重新赋值不会应用到 arguments[i] 上
"use strict";
function person(a,b){
a = 3;
b = 4;
console.log(arguments[0]);//1;
console.log(arguments[1]);//2;
};
person(1,2);
//给严格模式下以上输出值是3和4。
13. evel 函数内申明的变量不会影响到全局作用域
"use strict";
var x = 10;
evel("var x = 12");
console.log(x);//10
14. 任何在非严格模式下的静默失败(给不可写属性赋值, 给只读属性(getter-only)赋值, 给不可扩展对象(non-extensible object)的新属性赋值)都会抛出异常
"use strict";
// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // 类型错误(TypeError)
// 给只读属性赋值
var obj2 = { get x() { return 17; } };
obj2.x = 5; // 类型错误(TypeError)
// 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // 类型错误(TypeError)
15. this 不再转换为包装对象,所传即所得
"use strict";
function person(){
return this;
};
console.log(person());//undefined
console.log(person.call(1));//1
console.log(person.apply('1'));//'1'
console.log(person.bind(null)());//null
//非严格模式下,都会转换为包装类对象。
16. 顶层 this 指向 windows
"use strict";
function person(){
console.log(this);//undefined
};
person();
//严格模式下顶层 this 指向 windows;
四、意义
- 将 JavaScript 遗留的静默失败问题当成错误处理;
- 修复浏览器引擎无法优化的问题;
- 保留未来 JavaScript 版本可能使用的关键字(implements, interface, let, package, private, protected, public, static,yield)。

本文介绍了JavaScript严格模式,它是ES5引入的对sloppy模式的限制性使用,使用时在头部加“use strict;”。阐述了其特点,如各浏览器处理不同、合并代码可能冲突等。列举了应用场景,如禁止使用未申明变量等。还说明了其意义,包括处理遗留问题、修复优化问题等。
2074

被折叠的 条评论
为什么被折叠?



