Javascript--闭包(closure)
2010-04-02 10:58
302 查看
第一篇文章
在网上搜了好久这方面的知识,才找到一些资料,通过阅读发现,闭包确实很重要。
定义:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
先给出一个简单的例子:
函数a(): 里面定义了一个b函数,而函数a()的返回值是b函数。
调用关系:定义一个c变量直接调用a函数,而a函数返回的是b函数,所以此时相当于:var c = a.b();
然后再调用c(), 就相当于调用a.b(); 此时会alert什么呢? 答案是1。
解析:在javascript里面如果一个变量没有别调用的时候会被垃圾回收器回收掉,而这里函数a()里面的i是一个局部变量,所以在执行完var c = a();之后应该会被回收掉,但是这里却没有,这就是因为在a()函数里面的b()函数又调用了这个i,这里就产生了闭包的效果。
再看一个例子
这个例子会alert出什么呢?答案是3个4。
解析:在定义了局部变量i之后,在这个for循环里面也存在一个匿名函数,去访问外部的局部变量,所以此时,这个i就不会被垃圾回收器回收,而循环完成之后,i的值一直都是4,所以在点击元素的是后就会都是4。
个人理解:就是在函数的函数里面调用外层函数定义的局部变量,而此时局部变量不会被回收,而是一直都存在。
待续:有待理解更加深入的问题,javascript垃圾回收机制。
在网上搜了好久这方面的知识,才找到一些资料,通过阅读发现,闭包确实很重要。
定义:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
先给出一个简单的例子:
function a() { var i = 0; function b() { alert(++i); } return b; } var c = a(); c();
函数a(): 里面定义了一个b函数,而函数a()的返回值是b函数。
调用关系:定义一个c变量直接调用a函数,而a函数返回的是b函数,所以此时相当于:var c = a.b();
然后再调用c(), 就相当于调用a.b(); 此时会alert什么呢? 答案是1。
解析:在javascript里面如果一个变量没有别调用的时候会被垃圾回收器回收掉,而这里函数a()里面的i是一个局部变量,所以在执行完var c = a();之后应该会被回收掉,但是这里却没有,这就是因为在a()函数里面的b()函数又调用了这个i,这里就产生了闭包的效果。
再看一个例子
for (var i = 1; i < 4; i++) { var id = document.getElementById("a" + i); id.onclick = function() { alert(i); } }
这个例子会alert出什么呢?答案是3个4。
解析:在定义了局部变量i之后,在这个for循环里面也存在一个匿名函数,去访问外部的局部变量,所以此时,这个i就不会被垃圾回收器回收,而循环完成之后,i的值一直都是4,所以在点击元素的是后就会都是4。
个人理解:就是在函数的函数里面调用外层函数定义的局部变量,而此时局部变量不会被回收,而是一直都存在。
待续:有待理解更加深入的问题,javascript垃圾回收机制。
相关文章推荐
- 学习Javascript闭包(Closure)
- JavaScript 闭包深入理解(closure)
- 学习Javascript闭包(Closure)
- 在Javascript中闭包(Closure)(转载)
- 学习 JavaScript 最难点之二 -- 理解closure(闭包)
- javascript closure 闭包
- 学习Javascript闭包(Closure)
- 学习Javascript闭包(Closure)
- JavaScript 进阶(四)解密闭包closure
- 学习Javascript闭包(Closure)
- [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)
- 学习Javascript闭包(Closure)
- javascript 闭包(closure) 基础
- javascript中Closure(闭包)的含义
- [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)
- 学习Javascript闭包(Closure)
- Javascript 核心对象 执行上下文 Execution context 作用域链 Scope Chain 闭包 Closure
- 学习Javascript闭包(Closure)
- 学习Javascript闭包(Closure)
- javascript 闭包(closure) 与匿名函数的this