摘自百度百科,闭包的解释:闭包就是能够读取其他函数内部变量的函数。例如javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。本质上,闭包是将函数内部函数外接起来的桥梁。
通俗一点,个人理解:闭包是函数内部 定义一个在函数作用域下的函数 作为返回值,该函数的的变量外部无法修改。
function F1(){
var a = 100;
// 返回函数作为返回值
return function(){
console.log(a) // 在这个函数中a是自由变量 变量的定义去父级作用域中查找
}
}
// f1得到一个函数 变量的作用域是在定义时候确认,而不是执行时确认
var f1 = F1()
var a = 200
f1() // 输出 100 一个函数变量的作用域是在定义时候的作用域 而不是执行时候的作用域
闭包的使用场景:函数作为返回值、函数作为参数传值
function F1(){
var a = 100;
return function(){
console.log(a)
}
}
var f1 = F1()
function F2(fn){
var a =200;
fn()
}
F2(f1) // 结果为100
在实际应用当中,使用闭包可以封装变量,收敛权限。变量实际应用的场景:
// 封装变量 收敛权限
变量的第一次执行时返回true
function isFirstload(){
var _list = []
return function(id){
if(_list.indexOf(id)>=0){
return false
}else{
_list.push(id)
return true
}
}
}
var firstLoad = isFirstload()
firstLoad(10) // true
firstLoad(10) // false
firstLoad(20) // true
// 闭包应用的意义,用户无法修改_list中的值
闭包作为函数内部的函数,其变量的值外部不可以修改,可以收敛权限。在应用上,可使用闭包来封装变量。本文结。