我正在尝试使用闭包(我认为它就是它......),我只想在将来的某个时候用局部变量执行一个函数,如下所示:
function boo() {
var message = 'hello!';
var grok = function() { alert(message); }
foo(grok);
}
function foo(myClosure) {
$.ajax({
timeout: 8000,
success: function(json) {
myClosure();
}
}
}
我可以通过使用全局变量等解决这个问题,但宁愿使用类似上面的东西,因为它至少看起来更清晰一些。如何(如果可能的话)你这样做?
由于
-----------更新--------------------
对不起,我不清楚 - 我想知道这是否是关闭的正确语法,我试了一下,似乎没问题。谢谢。
答案 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
正在做正确的事。