严格模式
程序员文章站
2022-05-01 22:54:33
...
作用:
严格模式为JavaScript引入了很多变化(在此仅讨论明显变化,细微变化请查看附录文档介绍),在严格模式下,抛出的问题更多,可以更快更方便的调试代码
语法错误
去除with
// 在严格模式中以下JavaScript代码会抛出错误
with (location) {
alert(href);
}
防止全局变量修改
// 严格模式下会抛出异常
(function() {
someUndeclaredVar = "foo";
}());
函数中的this不再指向全局对象
普通函数例子
window.color = "red";
function sayColor() {
alert(this.color);
}
// 在strict模式中会报错, 如果不在严格模式中则提示 “red"
sayColor();
// 在strict模式中会报错, 如果不在严格模式中则提示 “red"
sayColor.call(null);
构造函数例子
this在被赋值之前会一直保持为undefined,这意味着当一个构造函数在执行时,如果之前没有明确的new关键词,会抛出异常。
function Person(name) {
this.name = name;
}
//在严格模式中会报错
var me = Person("Nicholas");
防止对象属性与函数入参名称重复
//重复的变量名,在严格模式下会报错
function doSomething(value1, value2, value1) {
//code
}
//重复的对象属性名,在严格模式下会报错:
var object = {
foo: "bar",
foo: "baz"
};
运行时错误
安全的eval
在eval()中执行的变量和函数申明不会直接在当前作用域中创建相应变量或函数,任何在eval()执行过程中创建的变量或者函数保留在eval()中
(function() {
eval("var x = 10;");
// 非严格模式中,alert 10
// 严格模式中则因x未被定义而抛出异常,
alert(x);
}());
修改只读属性时抛出异常
var person = {};
Object.defineProperty(person, "name" {
writable: false,
value: "Nicholas"
});
// 在非严格模式时,沉默的失败,在严格模式则抛出异常.
person.name = "John";
使用
"use strict";
指示JavaScript引擎切换到严格模式的作用(不支持严格模式的浏览器会忽略以上代码,不会对后续的执行产生任何影响;
不要再全局环境下启动严格模式 :当你不负责维护页面中引入的全部代码时,这样使用strict模式会让你面临由于第三方代码没有为严格模式做好准备而引发的问题。
// 请不要这么使用
"use strict";
function doSomething() {
// 这部分代码会运行于严格模式
}
function doSomethingElse() {
// 这部分代码也会运行于严格模式
}
修正用法:
function doSomething() {
"use strict";
// 这个函数中的代码将会运行于严格模式
}
function doSomethingElse() {
// 这个函数中代码不会运行于严格模式
}
作用于多个函数
(function() {
"use strict";
function doSomething() {
// 这个函数运行于严格模式
}
function doSomethingElse() {
// 这个函数同样运行于严格模式
}
}());
附录:
严格模式英文资料:(博客)It’s time to start using JavaScript strict mode,,(详细资料)ECMA-262-5 in Detail Chapter 2 Strict Mode,
支持严格模式:支持汇总
当前浏览器严格模式支持情况测试:测试页面
转载于:https://my.oschina.net/kangpb/blog/213232