JS高级笔记(3)函数进阶2

98 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

严格模式

严格模式在ie10以上版本的浏览器才会被支持,旧版本浏览器中会被忽略
严格模式对正常的js语义做了一些更改:
1.消除了js语法的一些不合理,不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在ECMAScript的未来版本中可能会定义的一些语法,为未来新版本的js做好铺垫,比如一些保留字如:class,enum,export,extends,import,super不能做变量名

开启严格模式

严格模式可以应用到整个脚本或个别函数中,因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况
1.为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict" (或'use strict')。
2.为函数开启严格模式
要给某个函数开启严格模式,需要把 "use strict" (或'use strict')生命凡在函数体所有语句之前

严格模式中的变化

1.变量规定
(1).在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var命令声明,然后再使用
(2).严禁删除已经声明的变量 ,例如delete x语法是错误的
2.严格模式下this指向问题
(1).以前再全局作用域函数中的this指向window对象
(2).严格模式下全局作用域中的this是undefined
(3).以前构造函数时不加new也可以调用,当普通函数,this指向全局对象
(4).严格模式下,如果构造函数不加new调用,this会报错
(5).new实例化的构造函数指向创建的对象实例
3.函数变化
(1).函数不能有重名函数
(2).函数必须声明再顶层。新版本的js会引入块级作用域。为了与新版本接轨,不允许再非函数的代码块内声明函数

高阶函数

高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出

闭包

变量作用域

变量根据作用域的不同分为两种:全局变量和局部变量 1.函数内部可以使用全局变量 2.函数外部不可以使用局部变量 3.当函数执行完毕,本作用域内的局部变量会销毁

什么是闭包

闭包指有权访问另一个函数作用域中变量的函数, 简单理解就是,一个作用域可以访问另一个函数内部的局部变量 闭包的主要作用:延伸了变量的作用范围

function fn(){
   var num=10;
    function fun(){
       console.log(num);
    }
    fun();
}
fn();

闭包案例:1.循环注册点击事件 2.循环中的setTimeout() 3.计算打车价格

递归

什么是递归

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数 简单理解:函数内部自己调用自己,这个函数就是递归函数 递归里面必须加退出条件

浅拷贝和深拷贝

1.浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用 2.深拷贝拷贝多层,每一级别的数据都会拷贝 3.object.assign(target,...sources) es6新增方法可以浅拷贝 深拷贝

function deepCopy(newobj,oldobj){
     for(var k in oldobj){
         //判断我们的属性值属于哪种数据类型、
         //1.获取属性值oldobj[k]
         var item =oldobj[k];
         //2.判断这个值是否是数组
         if(item instanceof Array){
             newobj[k]=[];
             deepCopy(newobj[k],ite,)
          }else if(item instanceof Object){
                //3.判断这个值是否是对象
                newobj[k] ={};
                deepCopy(newobj[k],item)         
           }else{
                  //4.属于简单数据类型
                      newobj[k] =item;
            }
      }
}