普通函数
function demo(args){
// ...
}
箭头函数
let demo = (args) => {
// ...
}
普通函数与箭头函数的区别:
- 普通函数中的
this
谁调用就指向谁;箭头函数的this
是其父作用域。 - 普通函数的
this
会被call / bind / apply
等改变;箭头函数中的this
不会被改变。
匿名函数
(function(){
// ...
})();
注意:
- 匿名函数一般作为其它函数的形参、实参、返回值。
- 匿名函数必须立即执行,不能只定义不执行。
函数的扩展运算符
function demo (...args){
// ...
}
函数的扩展运算符将函数的实参打包成了一个数组,供开发人员操作。
注意:函数的扩展运算符只能在所有形参的末尾。
函数作用域
作用域
- 全局作用域:在所有
{}
以外的区域 - 块级作用域:除了函数内部外,其它
{}
内的区域 - 局部作用域:函数内部的区域
不同作用域的区别
- 全局作用域中,用
var
和let
定义的变量都是全局变量 - 块级作用域中,用
var
定义的变量是全局变量,用let
定义的变量是局部变量 - 局部作用域中,用
var
和let
定义的变量都是局部变量
注意:在定义是省略var
和let
的变量,无论在哪个作用域定义的都是全局变量
函数预解析
预解析:
- 浏览器在执行 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;