目前浏览器主要以 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做好铺垫。