ECMAScript 5 严格模式

1. 变量必须使用var声明,杜绝不小心将本地变量声明成一个全局变量

  在常规模式下,如果我们声明一个变量时省略了var关键字,解析引擎会自动将其声明为全局变量,但在严格模式下,会直接抛出异常,不会为我们转为全局变量:  

message = 'hello world';

var color = 'red';
delete color;

2. 禁止函数参数重名

3. 禁止对象属性重名

'use strict';
//it should throw a SyntaxError in ES5 strict mode
var person = {
  name: 'Scott'
  name: 'John'
};
console.log(person.name);

4.禁止使用八进制数字

以0开头的八进制数字常常会让开发者迷惑,严格模式禁止以0开头的八机制表示法,另外,ES6已经支持新的语法标准,八进制以0o来表示,这样一来就与16进制的0x形成统一的语法格式: 

'use strict';
var a = 017;  //Uncaught SyntaxError: ...
 
var b = 0o17; //ES6 Octal syntax: 8 + 7 = 15

5. 强制为eval创建新作用域

常规模式下,使用eval函数可能会影响当前作用域或全局作用域,给程序的运行结果带来不确定性,严格模式为JavaScript程序创建了第三种作用域:eval作用域。eval函数中的字符串只能在eval作用域内运行,其结果不会影响外层作用域,下面这两种形式都可以使eval在严格模式下运行:

'use strict';
eval("var a = 1;");
console.log(a); //Uncaught ReferenceError: a is not defined
 
//or
 
eval("'use strict'; var b = 3;");
console.log(b); //Uncaught ReferenceError: b is not defined

6. 禁止对eval和arguments做非法操作

以下几种使用方式都会抛出语法错误:

使用var声明;

赋予另一个值:

尝试修改包含的值,如使用++;

用作函数名;

用作命名的函数参数;

7.禁止使用arguments.callee

8.禁止this指向全局

9. 函数必须声明在整个脚本或函数层面

'use strict';
if (true) {
  function doSomething() {
    console.log('1');
  }
} else {
  function doSomething() {
    console.log('2');
  }
}
 
for (var i = 0; i < 5; i++) {
  function doSomething() {
    console.log('3');
  }
}
 
doSomething();  //Uncaught ReferenceError: doSomething is not defined
 
原文地址:https://www.cnblogs.com/myzy/p/5909354.html