论坛首页 Web前端技术论坛

javascript 闭包的一个例子

浏览 8268 次
精华帖 (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这种特性,这种作用域机制,将闭包使用在无形之中,才算是真正会使用闭包了吧。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics