从一个题目开始
这个程序的结果是什么
// 创建一个函数 function fun() { // 定义局部变量 var name = 'kjh' // 返回一个局部函数 return function () { alert(name) } } // 调用外部函数,就能得到内部函数,用变量inn来接收 var inn = fun() // 定义一个全局变量 var name = 'abc' // 执行inn函数,就相当于在fun函数的外部,执行了内部函数 inn()
JavaScript中函数会产生闭包(closure)。闭包是函数本身和该函数声明时所处的环境状态的组合。
函数能够记忆住其定义时所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量。
在JavaScript中,每次创建函数时都会创建闭包。
但是,闭包特性往往要将函数换一个地方执行,才能被观察出来。
闭包很实用,因为它允许我们将数据与操作该数据的函数关联起来。与面向对象有少些相似之处
有记忆性:当闭包产生时,函数所处的环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。
function createCheckTemp(standardTemp){ function checkTemp(n) { if(n <= standardTemp){ alert('体温正常') } else { alert('体温不正常') } } return checkTemp } var checkTemp_A = createCheckTemp(37.1) checkTemp_A(37.2) checkTemp_A(37.0)
模拟私有变量:
// 封装一个函数,这个函数的功能就是私有化变量 function fun() { //定义一个局部变量a var a = 0; return { getA: function () { return a }, add: function () { a++; }, pow: function () { a*=2 } } } var obj = fun() // 如果想在fun函数外面使用变量a,唯一的方法就是调用getA()方法 obj.add() obj.add() obj.add()
不能滥用闭包,会造成网页的性能问题,严重时会导致内存泄露。
内存泄露是指程序中已经动态分配的内存由于某种原因未释放或者无法释放。
function addCount(){ var count = 0; return function() { count = count + 1; console.log(count) } } var fun1 = addCount(); var fun2 = addCount(); fun1(); //1 fun2(); //1 fun2(); //2 fun1(); //2