如何将值从闭包内返回到外部作用域?

时间:2012-08-27 14:55:19

标签: javascript scope closures

我遇到了将一个值从一个函数返回到另一个函数的需要,并且在这个简单的任务不起作用的时候,有一段时间让我感到困惑。然后我意识到我在一个闭包函数(或匿名函数?)中运行,并且无法找到有关如何从这样一个函数的范围中释放变量的文档。

例如,这不起作用:

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

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

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

感谢。

3 个答案:

答案 0 :(得分:4)

你需要调用闭包:

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

或者,如果它在其他地方运行,这是一个时间问题。您可以使用 promise

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);
   };
}

然后在可用时调用结果调用回调。

答案 1 :(得分:3)

你可以将一个对象传递给闭包,它在调用函数时会设置其属性'result'。

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

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

答案 2 :(得分:2)

这是不可能的;代码

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

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

有两种解决方案:

  1. 您可以使用容器(如Qnan所建议)

  2. 您可以使用回调。

  3. 第二种方法意味着:不要立即使用result,只要object.event具有一些有用的值,就让result后面的函数调用一些代码:

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