JavaScript闭包(closure)

来源:互联网 发布:淘宝直通车在哪设置 编辑:程序博客网 时间:2024/05/16 12:26
以为能写出静态页面,能写出js交互就可以混口饭吃,所以一直没有去深究一些原理和知识,老觉得会写就行,不会再去查嘛!殊不知说不出来,也是得不到认可的。做到了“知其然”,为什么不加一把劲做到“知其所以然”呢?

W3school给出的闭包(closure)概念是:

闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

这他喵说的是什么意思,不太懂啊… 所以继续掏度娘的脑仁…

想了解闭包,就要先了解变量的作用域,都知道,变量分为全局变量和局部变量。函数内部声明的变量是局部变量。如果对JavaScript有一点了解的,都知道函数内部可以访问全局变量,但是在函数外部想要得到函数内部的变量,怎么办呢?这个时候,闭包就闪亮登场了…

举一个栗子:

function foo1(){    n=999;    function foo2(){      return n ;            // 999    }  }  foo1();

函数foo2被函数foo1包裹在里面,函数foo1的局部变量对于函数foo2来说就是可见的,也就是说函数foo2是可以调用到函数foo1中的局部变量n的,但是,函数foo2内的局部变量对于函数foo1来说是不可见的,为foo2私有。
这里可以看到JavaScript“链式作用域”的特性。子对象会逐级向上查找父对象的变量,但是父对象是不能反过来查找子对象的变量的。
回到我们的目的:怎么在foo1外部得到foo1内部的变量。
既然foo2可以得到foo1的变量,那直接把foo2整个全部返回(return)不就行了吗?
如下:

function foo1(){    n=999;    function foo2(){      return n ;    }    return foo2;  }  var result=foo1();  result();              // 999

注意: 这里的函数foo2就是闭包!!! 知道了什么样的代码形式可以称为闭包,剩下的就是怎么用口语描述出来了。

可以理解为,闭包就是可以读取其他函数内部变量的函数。
本质上来说,闭包是连接函数内部与函数外部的桥梁。

闭包的用途:

1,读取函数内部的变量。

2,变量的值始终保持在内存中不被垃圾回收机制(garbage collection)销毁。

使用闭包需要注意的地方:

1,由于使用闭包后,变量始终在内存中不被GC回收,所以就存在内存消耗问题,有可能会引起内存泄露,尽量在退出函数时将不再使用的局部变量删除。

2,由于使用闭包后,函数外部可以获取甚至修改函数内部的局部变量,因此在修改时,请特别注意修改函数内部局部变量是在你明白的情况之下,以免引起不可预知的错误。

原创粉丝点击