js闭包
2017-10-01 14:56
246 查看
之所以有闭包这个概念,其实是因为变量作用域的问题。我们都知道变量的作用域分为全局作用域和局部作用域。全局变量可以在函数内部读取,在外部却不可以读取函数内部的局部变量。然而出于各种原因,有时候我们需要读取函数内的局部变量。一般情况下是不能这样做的,我们可以取巧,就是在函数内部再定义一个函数,返回变量的值:
return f2;
result = f1();
result(); // 999
这样就能在外部读取函数内的变量了。所有具有链式作用域的语言都有闭包这个概念。如果不用想太复杂的话,可以简单的把闭包想象成函数内部的函数,就是把函数外部和内部链接起来的桥梁。
闭包的作用主要有两个,第一个就是读取内部变量,第二个就是把变量的值储存在内存中。
我们都知道如果定义一个函数,每次创建一个实例对象时,由于有垃圾回收机制,都会把函数内变量的值清除,每次都会对对象进行初始化。但是如果使用闭包,例如:
要注意在使用闭包的时候尽量不要使用循环语句,这会造成一些错误。
function f1(){ var n=999; function f2(){ return n; // 999 }return f2;
return f2;
result = f1();
result(); // 999
这样就能在外部读取函数内的变量了。所有具有链式作用域的语言都有闭包这个概念。如果不用想太复杂的话,可以简单的把闭包想象成函数内部的函数,就是把函数外部和内部链接起来的桥梁。
闭包的作用主要有两个,第一个就是读取内部变量,第二个就是把变量的值储存在内存中。
我们都知道如果定义一个函数,每次创建一个实例对象时,由于有垃圾回收机制,都会把函数内变量的值清除,每次都会对对象进行初始化。但是如果使用闭包,例如:
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000这里运行了两次,可以看到n的值变成了1000,没有被清除。这是因为我们把f1赋值给了全局变量result,而f1就是f2的父函数,所以f2就一直存在于内存中,因此它的父函数f1也就存在内存中,局部变量n就不会在函数调用后被垃圾回收机制清除。
要注意在使用闭包的时候尽量不要使用循环语句,这会造成一些错误。
相关文章推荐
- js加强:js引擎,变量作用域,arguments对象,特殊函数,闭包
- js 闭包的作用 简单的例子 说明
- js闭包
- 一道JS前端闭包面试题解析
- 快速理解JS闭包
- js基础系列之作用域与闭包
- js中作用域与函数闭包
- javascript深入理解js闭包
- javascript深入理解js闭包
- javascript深入理解js闭包
- Js实现类继承和闭包私有成员并调用
- js闭包的作用
- JavaScript学习笔记(九)—— JS 理解闭包
- js笔记---作用域(执行上下文[execution context],活动对象) 闭包
- JS闭包
- Js的闭包,这篇写的是比较清晰明了的
- js闭包的用途
- javascript深入理解js闭包
- 关于js闭包的研究和理解
- JS中的匿名函数和闭包