ES5严格模式下的新规定

5.ES5

ESMAScript第5个版本

5.1严格模式

定义:比旧的js运行机制要求更严格的新的运行机制

如何使用:在当前代码段的顶部添加 “use strict”;

新规定:4个

  • 禁止给未声明过的变量赋值

1.在旧的js中,如果强行给未声明过的变量赋值,不会报错,而是自动在全局创建一个全局变量。——容易造成全局污染

2.严格模式下:强行给未声明过的变量赋值,会报错!——减少了因写错变量名造成的全局污染

  • 静默失败升级为错误

1.静默失败:程序运行不成功,但也不报错。——极其不利于调试程序

2.严格模式:将绝大部分静默失败都升级为错误,并报错!

  "use strict";

    var eric={
      eid:1001,
      sname:"埃里克"
    }
    //公司规定,员工编号禁止修改
    Object.defineProperty(eric,"eid",{
      writable:false
    })

    //有人试图修改eric的eid属性
    eric.eid=-2;//Uncaught TypeError: Cannot assign to read only property 'eid'
    console.log(eric);
  • 普通函数调用中的this不再指window,而是指undefined

1.旧的js中:普通函数调用中的this默认指window——极容易造成全局污染

2.严格模式:普通函数调用中的this指undefined,——防止因为错误使用this而导致的全局污染

    "use strict";

    function Student(sname,sage){
      console.log(this);
      this.sname=sname;//Cannot set property 'sname' of undefined
      this.sage=sage;
    }
    var lilei=new Student("Li Lei",11)
    //忘写new了!
    var hmm=Student("Han Meimei",12);
    //        this->window
    //        this.sname->window.sname
    //        this.sage->window.sage
    console.log(lilei);
    console.log(hmm);
    console.log(window);
  • 禁用了arguments.callee

什么是arguments.callee:是在一个函数内,获得当前函数本身的一种特殊关键字——递归

递归的问题1:在函数内写死了当前函数名,一旦外部函数名改变,内部函数名忘记修改,则程序立刻报错!——紧耦合

解决:在函数内使用arguments.callee代替写死的函数名。在运行时,会自动获得当前函数本身——松耦合

递归的问题2:重复计算量太大:递归效率低

解决:如果递归调用是严重影响程序的性能时,就要用循环来代替递归

// "use strict";
    
    //斐波那契数列: 
    //1 1 2 3 5 8 13 21 34 55
    //1 2 3 4 5 6 7  8  9  10
    //前两个数是都是1,
    //从第三个数开始,每个数都是它相邻的前两个数的和
    //数学: 
    //f(1)=1   f(2)=1
    //f(n)=f(n-1)+f(n-2)
    //计算斐波那契数列中第n个数是几
    function f(n){
      if(n<3){
        return 1
      }else{
        return arguments.callee(n-1)+arguments.callee(n-2);
      }
    }
    console.log(f(10));//55

总结:

i. 如果递归调用没有影响程序的效率,就首选递归——简单,直观

ii. 如果递归调用却是影响了程序的效率,则被迫改为循环实现——难度极高.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值