使用闭包来执行将来的功能?

时间:2010-07-02 20:30:48

标签: javascript

我正在尝试使用闭包(我认为它就是它......),我只想在将来的某个时候用局部变量执行一个函数,如下所示:

function boo() {
    var message = 'hello!';
    var grok = function() { alert(message); }
    foo(grok);
}

function foo(myClosure) {
    $.ajax({
        timeout: 8000,
        success: function(json) {
            myClosure();
        }
    }
}

我可以通过使用全局变量等解决这个问题,但宁愿使用类似上面的东西,因为它至少看起来更清晰一些。如何(如果可能的话)你这样做?

由于

-----------更新--------------------

对不起,我不清楚 - 我想知道这是否是关闭的正确语法,我试了一下,似乎没问题。谢谢。

3 个答案:

答案 0 :(得分:1)

您的现有代码看起来非常好,除了最后丢失的paren。 ;)

如果您希望更深入地理解闭包的概念,请以这种方式考虑:只要定义了闭包语言中的某些内容,它就会保留对定义它的本地范围的引用。

对于你的代码,$ .ajax()的参数是一个新创建的对象(“{timeout:8000,etc.}”),它包含一个新创建的函数(匿名“成功”) function),它包含对同一范围内的局部变量(“myClosure”)的引用。当“success”函数最终运行时,它将使用对本地作用域的引用来获取“myClosure”,即使“foo()”很久以前就已经运行了。这样做的缺点是你最终可能会在闭包中绑定很多不合适的数据 - 在删除所有引用之前,数据不会被释放。

回想起来,我可能会让你感到困惑,而不是帮助你。对不起,如果是这样的话。 :\

答案 1 :(得分:0)

这是你想要的吗?

var boo = (function() {
    var message = 'hello!';
    return function() {
      foo(function() { 
        alert(message); 
      });
    };
})();

function foo(myClosure) {
    $.ajax({
        timeout: 8000,
        success: function(json) {
            myClosure();
        }
    }
}

或只是

function boo() {
    $.ajax({
        timeout: 8000,
        success: function(json) {
            alert('hello!'); 
            // do sth with json
            // ...
        }
    }); // <- missed a paren
}

这个例子太简单了,不知道你想要什么。

答案 2 :(得分:0)

除非您真的想要进行AJAX调用,setTimeout可能更符合您的要求:

function foo(myClosure) {
    setTimeout(myClosure, 8000); // execute the supplied function after 8 seconds
}

如果您的问题更像“我是否正确创建了一个闭包?”,那么是的,您的函数boo正在做正确的事。