1 | function f1(){ |
上面代码产生了闭包
闭包的概念
下面是一些官方的概念
函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。
闭包(closure)是指有权访问另一个函数作用域中变量的函数
闭包是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
但不要咬文嚼字,我们简单的可以理解为
闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」
通俗的理解
闭包 就是 能够读取 其他函数 内部(局部)变量 的函数。
上面代码中 f2 可以访问 f1 的 n变量 也就是局部变量,于是产生了闭包,f2就是闭包函数
闭包的作用
主要作用:延申了变量的作用范围
它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。(等所有的函数调用完了 才会销毁)
使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
闭包经典案例
代码片段二。
1 | var name = "The Window"; |
代码片段二。
1 | var name = "The Window"; |
https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html