JavaScript严格模式

目前浏览器主要以 es3 + es5 规则为准  如果es3 和 es5 使用规则发生冲突 以 es3为准

启动严格模式 将以 es5 为准

//启用方式

"use strict" //必须写在作用域最顶端 

//老版本的浏览器会把它当作一行普通字符串,加以忽略。

 

 

正常模式的区别
1. 禁用with

( es3 可以使用 )

var obj ={name:"abc"}
with (obj){
//会继承obj作用域
console.log(name)//"obj"
//使用with改变了作用域链会消耗大量效率 所以 使用 with会报错 
}
```
2. 禁用arguments.celler / arguments.cellee 使用会报错

3. 全局指向 window 局部为 undefined 
```
function test (){
console.log(this)//undefined
}

4. 重复的参数会报错 重复的属性不会报错但后面的值会覆盖前面的值

function test (a,a){
console.log(a)// es5: 报错 es3: 2
}
test(1,2)
var obj ={
name:123,
name:234
}
console.log(obj)// es5/ es3: 234 不报错

5. eval es5 和es3 禁止使用 eval 功能类似于with 会改变全局作用域 字符串也可以当代码运行解析
6. 未声明的变量将会报错

function (){
a=8 //error
}

7. 赋值类报错

// 给不可写属性赋值
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错误

 

8. 试图删除不可删除的属性时会抛出异常 删除禁止声明变量

delete Object.prototype; // 抛出TypeError错误
var a;
delete a //!!! 语法错误

9. 禁止八进制数字语法

var sum = 015 // !!! 语法错误

10.严禁给原始(primitive)数据类型设置属性

false.true = ""; //TypeError
(14).a = "c"; //TypeError
"with".b = "d"; //TypeError

11. 函数必须声明在作用域顶层,不允许在非函数的代码块内声明函数。

1 2   if (true) {
3     function fun() { } //TypeError
4   }
5 
6   for (var i = 0; i < 5; i++) {
7     function fun1() { } //TypeError
8   }
9 

 

严格模式好处主要有:
  - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  - 消除代码运行的一些不安全之处,保证代码运行的安全;
  - 提高编译器效率,增加运行速度;
  - 为未来新版本的Javascript做好铺垫。

posted @ 2019-02-11 12:32  G_Owen  阅读(238)  评论(0编辑  收藏  举报