严格模式(strict mod)的作用:
Strict mode是JavaScript1.8.5引进的技术,今天,所有主流的浏览器都在他们的最新版本中支持了严格模式(包括IE10,Opera12和Android4,IOS5)是时候开始使用严格模式了。严格模式的一大目标是让你能更快更方便的调试。运行环境在发现问题时显性的抛出错误比默不做声的失败或怪异行事(未开启严格模式的JavaScript运行环境经常这样)要好。严格模式会抛出更多错误,但这是好事,因为这些错误会唤起你注意并修复很多以前很难被发现的潜在问题。
严格模式的具体体现:
1.去除with关键词
// 在严格模式中以下JavaScript代码会抛出错误 with (location) { alert(href); }2. 函数中的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");在上面的代码中,Person构造函数运行时因为之前没有new,函数中的this会保留为undefined, 由于你不能为undefined设置属性,上面的代码会抛出错误。 在非strict模式环境中,没有被复制的this会默认指向window全局变量,运行的结果将是意外的为window全局变量设置name属性。
当编写大量代码时,对象属性和函数参数很容易一不小心被设置成一个重复的名字。严格模式在这种情况下会显性的抛出错误
//重复的变量名,在严格模式下会报错 function doSomething(value1, value2, value1) { //code } //重复的对象属性名,在严格模式下会报错: var object = { foo: "bar", foo: "baz" };以上的代码在严格模式中都会被认为是语法错误而在执行前就让你能得到提示。
4.安全的 EVAL()
在eval()中执行的变量和函数申明不会直接在当前作用域中创建相应变量或函数
(function() { eval("var x = 10;"); // 非严格模式中,alert 10, 严格模式中则因x未被定义而抛出异常, alert(x); }());5.对只读属性修改时抛出异常
ECMAScript5中还引入为对象的特定属性设为只读,或让整个对象不可修改的能力。 但在非严格模式中,尝试修改一个只读属性只会默不做声的失败。 在你和一些浏览器原生API打交道过程中,你很可能遇到这种情况。严格模式会在这种情况下明确的抛出异常,提醒你修改这个属性是不被允许的。
var person = {}; Object.defineProperty(person, "name" { writable: false, value: "Nicholas" }); // 在非严格模式时,沉默的失败,在严格模式则抛出异常. person.name = "John";建议:使用任何ECMAScript属性特性指定时开启严格模式
使用方法:
在js中添加"use strict";指令,但最好不要在全局环境中使用该指令,这样使用strict模式会让你面临由于第三方代码没有为严格模式做好准备而引发的问题。因此,最好把开启严格模式的指令作用于函数中,或者在立即执行函数表达式使用该指令可以在该作用域内开启严格模式。如下:
function doSomething() { "use strict"; // 这个函数中的代码将会运行于严格模式 } (function() { "use strict"; function doSomething() { // 这个函数运行于严格模式 } function doSomethingElse() { // 这个函数同样运行于严格模式 } }());
严格模式的优势:使JavaScript更牢固
1. This不再被封装,在normal mode下,this一直是对象。
2. Fun.caller和fun.arguments即不是可以删除的属性,也不能被set或retrieved。
3. Arguments.caller也是不可以删除的属性,也不能set或retrieved。
为将来的ECMAScript版本铺平道路
1. 增加了下列保留字:implements, interface, let,package, private, protected, public, static和yield 。
2. 方法声明应该放在脚本或方法的最前面,不能放在if或for等语句中间。