JS 中 六 种函数
命名函数(Named Functions):具有明确名称的函数,可在声明前或后调用(函数提升)
匿名函数(Anonymous Functions):没有名称的函数,通常作为参数传递或赋值给变量。
箭头函数(Arrow Functions):ES6 新增的简洁语法,没有自己的 this、arguments,不能用作构造函数。
构造函数(Constructor Functions):用于创建对象实例,通常首字母大写,需配合 new 使用。
立即执行函数(IIFE,Immediately Invoked Function Expressions):声明后立即执行,用于创建独立作用域。
生成器函数(Generator Functions):ES6 新增,可暂停 / 恢复执行,返回迭代器,函数名前加 *。
箭头函数
shell
# 特点
语法简洁
# 缺点
无 arguments
无 自己的this(当前箭头函数所在函数)
无 constructor、prototype、super,不能作为构造函数
无法通过 call apply bind 改变 this
# 注意
在 ES6 class 中可以使用 箭头函数,this指向没问题,永远指向类实例创建函数的两种写法
shell
# 其一:函数声明式创建,使用 function 函数专属声明
特点:函数提升只要创建函数,那么在整个页面中任意位置都可调用,包括函数的上方调用依然生效
# 其二:函数表达式创建,匿名函数赋值给一个变量
必须先声明后调用,在函数之上调用会报错立即执行函数
js
立即执行函数 IIFE:定义函数立刻自动执行,定义完不用手动调用。
IIFE 特点:自动执行、独立作用域、变量私有、执行完即销毁、可以传参、不污染命名空间
主要用途:隔离变量、一次性初始化、老式循环闭包、模拟模块。
// 写法1 函数表达式
(function() {
console.log('立即执行')
})();
// 写法2 箭头函数
(() => {
console.log('立即执行')
})();
// 传参
(function(a, b){
console.log(a + b);
})(10, 20);
// 使用场景
隔离作用域,防止全局变量污染:老式无模块化时代,所有代码塞一个 JS 文件,用 IIFE 把业务逻辑包起来,内部变量不暴露到 window。
初始化只执行一次的逻辑页面初始化、配置初始化、挂载全局常量,只跑一次即可。
循环中解决 var 变量绑定问题(经典老场景)
for(var i = 0; i < 3; i++){
(function(j){
setTimeout(() => console.log(j), 1000)
})(i)
}
// 现在还有必要用吗?
ES6 之后有 let/const、块级作用域、ES Module,IIFE 用得大幅减少;