锁定老帖子 主题:javascript 闭包的一个例子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-11
suiye007 写道 kidneyball 写道 suiye007 写道 superobin 写道 虽然勉强可以算是闭包,但是基本没有体现闭包的特性额
var closure = (function() { var a = 3; return function() { alert(a); }; })(); closure();//3 这个或许可以再深入一点? 我不明白你的代码与下面的代码有什么区别呢,或简单的说是优点呢? var closure = function() { var a = 3; return function() { alert(a); }; }; closure();//3 下面的代码调用closure()得到的结果不是3,而是一个闭包。上面的代码closure本身就是闭包,调用这个闭包得到结果3 谢谢,发现问题所在了,我取的时候也是3,是New一个对象,然后,apply的,直接调用确实不是,不过,我有点不太明白什么时候要用闭包,什么时候不要用,虽然我的程序中闭包用得也比较的多,那是不得已的时候才用的 ,能给点经验吗? 我觉得闭包是一种更自然的代码形式,可以让你不拘泥于简单的块、函数作用域而穿透作用域。 举2个例子,一个用于隐藏一些变量,另一个用于异步调用: 1、隐藏变量: Function.prototype.bind = function(obj) { var _this = this; return function() { _this.apply(obj,arguments); }; } 这个是最原始的Prototype框架里bind函数(绑定函数作用域)的最简化版本。在这里,我们可以看到调用bind后对obj对象的隐藏(这段代码可以理解为一种转移作用域的代理模式吧)。 2、异步调用。 假如我们有一段代码 function test() { var a = 1,b=2,c=3; alert(a+b+c); } 需要改成异步延时的,只需要改成 function test() { var a = 1,b=2,c=3; setTimeout(function() { alert(a+b+c); },1000); } 其实经验上讲,绝大多数的同步的地方改成异步都都可以用上述方法,只要将需要异步的部分(通常是从某一行开始到函数末尾)包含在闭包中,就可以进行异步处理了。 其实还有挺多其他应用,总之,如果心里想着“什么是闭包”,“我在用闭包”这种事的话,反而往往用不好闭包。只要深刻的理解js这种特性,这种作用域机制,将闭包使用在无形之中,才算是真正会使用闭包了吧。 |
|
返回顶楼 | |