ES标准 经历 es 1.0 es 3.0 es 5.0
↓
当前,浏览器是 基于es 3.0 + es 5.0新增方法 实现
↓
es 3.0 和 es 5.0 存在冲突
↓
启用es 5.0的严格模式 --> 有冲突的部分就会使用es 5.0的方法
不启用es 5.0的严格模式 --> 有冲突的部分就会使用es 3.0的方法
es 5.0严格模式
'use strict' //之所以用字符串进行标识,是因为如果使用类似于strict()函数的形式,某些没有实现ES5规范的浏览器找不到这样的函数,会有风险
(向后兼容,老的浏览器不会报错,新的浏览器能够识别出严格模式)
1. 不再兼容es3的一些不规则语法,使用全新的es5规范
2. 两种用法
- 全局严格模式
- 局部函数内严格模式(推荐)
3. 只是一行字符串,不会对不兼容严格模式的浏览器产生影响
4. - 不支持with, callee, arguments, func, caller
- 变量赋值前必须声明
- 局部this必须被赋值(Person.call(null/undefined), 赋值什么就是什么)
- 拒绝重复属性和参数(对象中有重复的属性名不会报错,但是后面的属性值会覆盖前面的)
启用es 5.0的严格模式:
1. 在顶端加上''use strict''
1 'use strict'; //es 5.0 严格模式的启动 2 function test(){ 3 console.log(arguments.callee); 4 } 5 test();
执行上述代码后,报错如下:
类型错误,严格模式下,无法使用caller, callee, arguments等属性
2. 在局部函数的顶端加上
1 function demo(){ 2 console.log(arguments.callee); 3 } 4 demo(); 5 function test(){ 6 'use strict'; 7 console.log(arguments.callee); 8 } 9 test();
执行结果如下:
demo()正常执行,test()报错
with函数:
改变内部函数的作用域链,可以简化代码,但是会影响系统运行效率
1 var obj = { 2 name : 'obj'; 3 } 4 var name = 'window'; 5 6 function test(){ 7 var name = 'scope'; 8 with(obj){ //会把传入的参数放到with内函数作用域链的顶端 9 console.log(name); 10 } 11 }
test()执行后,打印 obj
利用with函数的特性,可以结合命名空间使用
1 var org = { 2 department1: { 3 alice : { 4 name : 'aaa', 5 age : 23 6 7 }, 8 kirito : { 9 10 } 11 12 }, 13 department2 = { 14 15 } 16 } 17 18 with(org.department1.alice){ 19 //这里面的函数执行时,会优先到传入的参数空间中去查找变量 20 }
简化代码:一下的两个代码块都是实现在网页上打印字符a
1 with(document){ 2 write('a'); 3 }
document.write('a');
eval()函数
1 'use strict'; 2 var a = 234; 3 eval('console.log(a)'); //作为参数的字符串会被当作正常的代码执行