4

我遇到了从一个函数返回一个值到另一个函数的需要,当这个简单的任务不起作用时,我一度困惑地挠了挠头。然后我意识到我在一个闭包函数(或匿名函数?)中操作,并且找不到关于如何将变量释放到此类函数范围之外的文档。

例如,这不起作用:

function aFunc()
{
   var result;
   object.event = function(){
      result = true;
   }
   return result;
}

也不会从封闭内部返回。我需要两者都做吗?我尝试在尽可能大的范围内(所有函数之外)使用全局变量,但这也不起作用。我错过了什么?

我不确定我是否正确使用了闭包这个术语,我指的是匿名函数。

谢谢。

4

3 回答 3

4

您需要调用闭包:

function aFunc() {
   var result;
   object.event = function() {
      result = true;
   };
   object.event();
   return result;
}

或者,如果它在其他地方运行,这是一个时间问题。你可以有类似承诺的东西:

function aFunc() {
   var promise = { hasRun: false, result: null };
   object.event = function() {
      result.hasRun = true;
      result.result = true; // or something else...
   };
   return promise;
}

// check if it has run and get the result:

if (promise.hasRun) {
  // access promise.result
}

但是,一个简单的回调就足够了。由于您提到了该XMLHttpRequest对象,您应该能够将回调附加到其onreadystatechange事件,或将回调传递给aFunc

function aFunc(callback) {
   object.event = function() {
      var result = true;
      callback(result);
   };
}

然后,您的回调会在结果可用时被调用。

于 2012-08-27T14:59:45.443 回答
3

您可以将一个对象传递给闭包,该对象的属性“结果”将在调用函数时设置。

function aFunc (foo) {
    object.event = function() {
        foo.result = true;
    }
}

问题是 的值result是由aFunc,而不是对它的引用返回的,这意味着result在闭包内发生的任何后续更改都不会影响result之前返回的 。

于 2012-08-27T14:57:36.563 回答
2

这是不可能的;编码

object.event = function(){
    result = true;
}

实际上并没有执行result = true;,它只是定义了一个将设置resulttrue. result在调用函数之前使用会产生一个未定义的值。

有两种解决方案:

  1. 您可以使用容器(如 Qnan 建议的那样)

  2. 您可以使用回调。

第二种方法的意思是:不要result马上使用,而是让后面的函数object.event调用你的一些代码,只要result有一些有用的价值:

object.event = function(){
    result = true;
    callback(result);
}
于 2012-08-27T15:05:18.437 回答