(1)用来返回值
function fun(){
let name = 'woniu'
//定义闭包
return function f1(){
return name
}
}
let ft = fun()
let na = ft()
console.log(na)
(2)函数赋值:在函数内部定义函数表达式
var f2
function fn(){
let name = '曹操'
f2 = function(){
return name
}
}
fn()
console.log(f2())
(3)把闭包作为函数的参数
function fn(){
let name = '蜗牛学苑'
//定义闭包
return function callback(){
return name
}
}
let f1 = fn()
function f2(temp){
console.log(temp())
}
f2(f1)
(4)在立即执行函数中使用闭包
//立即执行函数
(function(){
let name = '蜗牛学苑'
let f1 = function(){ //f1是闭包
return name
}
fn2(f1)
})()
function fn2(temp){
console.log(temp())
}
(5)循环赋值(在循环中使用闭包)
(function fn(){
for(let i=1;i<=10;i++){
(function(j){
setTimeout(function(){
console.log(j)
},j*1000)
})(i)
}
})()
(6)getter和setter(将闭包封装到对象中)
function fun(){
let name = '蜗牛学苑'
setName = function(na){
name = na
}
getName = function(){
return name
}
return {
setUserName: setName,
getUserName: getName
}
}
let obj = fun()
console.log('用户名:',obj.getUserName())
obj.setUserName('石油学院')
console.log('用户名:',obj.getUserName())
(7)通过闭包实现迭代
var arr = ['aa','bb','cc']
function fn(temp){
let i = 0
//定义闭包:迭代获取数组元素并返回
return function(){
return temp[i++] || '数组已经遍历结束'
}
}
let f1 = fn(arr)
console.log(f1())
console.log(f1())
console.log(f1())
console.log(f1())
(8)首次区分(相同的参数,函数不会重复执行)
var fn = (function () {
var arr = [];
return function (val) {
if (arr.indexOf(val) == -1) {
//缓存中没有则表示需要执行
arr.push(val);
console.log("函数被执行了", arr);
} else {
console.log("此次函数不需要执行");
}
console.log("函数调用完打印,方便可查看已缓存的数组", arr);
};
})();
fn(10);
fn(10);
fn(1000);
fn(200);
fn(1000);