-
闭包的概念
- 闭包函数就是能够读取其它函数局部变量的函数
-
理解变量作用域
-
首先要理解一下变量作用域,在js中无外乎分为
局部作用域
,全局作用域
,特点是,局部作用域,可以访问全局作用域声明的变量,但是全局作用域下,无法访问局部作用域下声明的变量// 1- 在函数内部,可以访问全局下声明的变量 var n=999; function f1(){ alert(n); } f1(); // 999 // 2- 读取函数内部的变量,是无法访问的 function f1(){ var n=999; } alert(n); // error // 3- 需要注意,如果在函数内部不使用var申请变量,那么会变成一个全局的变量 function f1(){ n=999; } alert(n); // 999
-
-
如何从函数外部读取局部变量
-
通过上述的演示,想要获取到内部变量,是无法实现的,这个时候,要想获取的话,可以在函数内部在去定义一个函数
function f1() { var n = 999 function f2() { alert(n) // 999 } } /* 在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。 这就是Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。 既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗! */
-
改写成以下方式
function f1() { var n = 999 function f2() { alert(n) } return f2 } var result = f1() result() // 999
-
-
闭包函数的用途
-
实现公有变量(函数累加器)
function add(){ var num = 0; function a(){ console.log( ++ num); } return a; } var myadd = add(); myadd();//结果为1 myadd();//结果为2
-
可以缓存(存储结构)
-
可以实现封装(私有化变量)
function Deng(name,wife){ var prepareWife = "传智教育"; this.name = name; this.wife = wife; this.divorce = function(){ this.wife = prepareWife; } this.changePrepareWife = function(target){ prepareWife = target; } this.sayPrepareWife = function(){ console.log(prepareWife); } } var deng = new Deng('黑马','传智');
-
-
闭包函数的注意事项
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值
10-18
07-27