调整字号

JavaScript 严格模式

ECMAScript 5 中引入了“严格模式”的概念,支持严格模式的浏览器包括 IE 10+、Firefox 4+、Safari 5.1+ 和 Chrome。严格模式执行更为严格的语法,代码的行为更加可靠,并且可以优化执行速度。对于之前一些静默失败的行为,在严格模式下会抛出明显的错误。

使用

要进入严格模式,需要在代码顶部添加一个字符串:

"use strict";

可以放在整个脚本的顶部,或是某个函数体的第一行。

function doSomething() {
  "use strict";
  // 整个函数以严格模式运行
}

变量

在严格模式下,不允许省略 var 关键字来创建全局变量。

message = "Hello World! ";
// 非严格模式:创建全局变量
// 严格模式:抛出 ReferenceError

其次,不能对变量调用 delete 操作符。非严格模式下允许这样操作,但会静默失败(返回 false)。而在严格模式下会抛出错误。

严格模式还增加了一些保留字:implementsinterfaceletpackageprivateprotectedpublicstaticyield,不能用其作为变量名,会抛出 SyntaxError。

对象

通过对象字面量创建对象时,不允许重名属性存在:

var person = {
                name: "Nicholas",
                name: "Greg"
             };
//非严格模式:以第二个属性为准
//严格模式:抛出 SyntaxError

在非严格模式下,后面的属性值会覆盖前面的同名属性。

函数

严格模式下,也不允许重名的参数:

function sum (num, num) {
  //do something
}

在非严格模式下,通过 num 只能访问第二个参数,要访问第一个需要通过 arguments 对象,而在严格模式下会抛出错误。

在非严格模式下,修改函数参数的值,也会反映到 arguments 对象中,而严格模式下不会:

function showValue(value) {
  value = 1;
  alert(value);         // 1
  alert(arguments[0]);  // 非严格模式:1,严格模式:2
}
showValue(2);

在严格模式下,淘汰了 arguments.calleearguments.caller,访问它们会抛出错误。

还有一点限制就是,只能在脚本的顶层或函数内部声明函数,也就是说,不能在 if 等代码块中声明函数,否则抛出 SyntaxError:

if(true) {
  function doSomething() {
    // ...
  }
}

eval()

严格模式下,eval() 有一个单独的作用域,在 eval() 中创建的变量或函数,只在 eval() 中有效。

function doSomething() {
  eval('var x = 10');
  alert(x);
}
//非严格模式:10
//严格模式:抛出 ReferenceError

evalarguments

在严格模式下,evalarguments 也不能作为标识符,也就是不能当做变量名或函数名。

this

在严格模式下,全局作用域中执行的函数,其 this 值不再是 window,而是 undefined

非严格模式中,使用 call()apply() 时,如果传入的 this 值是 nullundefined,会自动转换为全局对象,而严格模式下不会。

其他变化

严格模式下,使用 with 语句会导致错误。

另外,去掉了 Number 的八进制字面量。以 0 开头的数字在非严格模式下解析为八进制,而在严格模式下是无效的语法。

var value = 010;
//非严格模式:值为 8
//严格模式:抛出 SyntaxError
还没有评论,沙发空缺中……
flight