function fun() {
var name = '慕课网';
function inner() {
alert(name)
}
return inner
}
var inn = fun();//调用外部函数,就能得到内部函数,用变量inn来接收 inn();
//执行inn函数,就相当于在fun函数的外部,执行了内部函数
//fun函数本身和该函数声明是所处的环境状态的组合叫闭包
闭包:JS中函数会产生闭包,闭包是函数本身和该函数声明时所处的环境状态的组合
闭包现象:在JS中每次创建函数都会创建闭包,但是闭包特性往往需要“换一个地方执行”,才能会观察出来
闭包能够“记忆住”其定义时所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量
作用:闭包允许我们将数据与操作该数据的函数关联起来,这与面向对象编程有少许相似之处
具体功能:记忆性,模拟私有变量
闭包记忆性:当闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被 自动清除
闭包(其实就是作用域应用的特殊情况)闭包的两种常见方式:1.函数作为参数被传递,2.函数作为返回值被返回)
创建体温检测函数checkTemp(n),可以检查体温n是否正常,函数会返回布尔值,不同的小区有不同的体温检测标准,A小区合格是37.1度,B是37.3
//闭包现象,函数作为返回值被返回 function createCheckTemp(Temp) { function checkTemp(n) { if (n <= Temp) { alert('你的体温正常') } else { alert('你的体温偏高') } } return checkTemp; } var check_A = createCheckTemp(37.1) check_A(37.3);//体温过高,闭包记忆性,创建时的标准温度传入的是37.1 check_A(37.2);//体温过高,闭包记忆性,创建时的标准温度传入的是37.1 var check_B= createCheckTemp(37.2) check_B(37.2)//新的函数,体温正常,闭包记忆性,创建时的标准温度传入的是37.2
在这个例子中,我们在函数createCheckTemp
中又定义了函数checkTemp
,并且,内部函数 checkTemp
可以引用外部函数createCheckTemp
的参数和局部变量,当createCheckTemp
返回函 数sum
时,相关参数和变量都保存在返回的函数 中,这种称为“闭包(Closure)”的程序结构拥有极大的 威力,请再注意一点,当我们调用checkTemp()
时,每次调用都会返回一个新的函数,即使传入相同 的参数。
/* 模拟私有变量
题目:请定义应该变量a,要求是能保证这个a只能被进行指定操作(如加1,乘2),而不能进行其他操作
*/
//封装一个函数,这个函数的功能就是私有化变量
function fun() { //定义一个局部变量 var a = 0; return { getA: function () { return a; }, add: function () { return ++a; } }; } var obj = fun(); console.log(obj.getA()) console.log(obj.add()) //如果想在函数外面使用变量a,只能调用getA()方法
/* 使用闭包的注意点:不能滥用闭包,否则会造成网页的性能问题,严重时可导致内存泄漏,
所谓内存泄漏是指程序中已动态分配的内存由于某种原因未释放或无法释放。跟浏览器有关,ie可能会出现*/
// /* 函数作为返回值 */
function created() {
let a = 100
return function () {
console.log(a)//100
}
}
let fn = created()
let a = 200;
fn()
//函数作为参数
function print(fn) {
let a = 200
fn()
}
let a = 100
function fn() {
console.log(a)
}
print(fn)
//所有的自由变量的查找,是在函数定义的地方向上级作用域查找,不是在执行的地方