JS学习笔记 之 ES5严格模式

让人想犯罪 __ 提交于 2019-12-03 15:05:32

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)'); //作为参数的字符串会被当作正常的代码执行

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!