JavaScript函数

普通函数

function demo(args){
  // ...
}

箭头函数

let demo = (args) => {
  // ...
}

普通函数与箭头函数的区别:

  • 普通函数中的this谁调用就指向谁;箭头函数的this是其父作用域。
  • 普通函数的this会被call / bind / apply等改变;箭头函数中的this不会被改变。

匿名函数

(function(){
 // ... 
})();

注意:

  • 匿名函数一般作为其它函数的形参、实参、返回值。
  • 匿名函数必须立即执行,不能只定义不执行。

函数的扩展运算符

function demo (...args){
  // ...
}

函数的扩展运算符将函数的实参打包成了一个数组,供开发人员操作。

注意:函数的扩展运算符只能在所有形参的末尾。

函数作用域

作用域

  • 全局作用域:在所有{}以外的区域
  • 块级作用域:除了函数内部外,其它{}内的区域
  • 局部作用域:函数内部的区域

不同作用域的区别

  • 全局作用域中,用varlet定义的变量都是全局变量
  • 块级作用域中,用var定义的变量是全局变量,用let定义的变量是局部变量
  • 局部作用域中,用varlet定义的变量都是局部变量

注意:在定义是省略varlet的变量,无论在哪个作用域定义的都是全局变量

函数预解析

预解析:

  • 浏览器在执行 javascript 代码时不会直接按照顺序执行代码,而是加工之后执行
  • 浏览器在加工 javascript 代码时会分为两步: 先预解析再按照书写顺序执行其他代码,这个加工的过程称之为预解析

预解析规则:

  • 直接使用function关键字定义的函数会被提升到这个js代码的顶部,无论在什么地方调用能够成功
  • 使用var定义变量并赋值的函数,由于var定能够以的变量存在变量提升,但赋值函数不会进行预解析,所以在函数定义之前调用变量值为undefined
  • 使用let定义变量并赋值的函数,由于let不存在变量提升,并且赋值函数不会进行预解析,所以在函数定义之前调用会报错

闭包函数

  • 闭包函数是一种特殊的函数,当一个函数使用了外部函数的数据(变量、函数),内部函数就会形成闭包。

  • 闭包的两个条件:函数嵌套、内部函数使用外部函数数据。

  • 闭包特点:只要内部函数还在使用外部函数,外部函数被使用的数据就不会被立即释放,所以闭包就可以延长外部函数数据使用周期。

  • 注意:当后续不需要使用闭包时,一定要手动把闭包置为null,防止出现内存泄露

    let demo = () => {
        let num = 666;
        return () => {
            console.log(num);
        }
    }
    
    let fn = demo();
    fn(); // 666
    
    fn = null;
    
posted @ 2019-10-16 21:35  aaCoder  阅读(88)  评论(0编辑  收藏  举报