如何将闭包内的值返回到外部范围

How to return a value from within closure to external scope?

本文关键字:返回 外部 范围 闭包      更新时间:2023-09-26

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

例如,这不起作用:

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

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

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

谢谢。

您需要调用闭包:

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

然后,您的回调将在可用时被调用并得到结果。

您可以将对象传递给闭包,当调用函数时,它将设置闭包的属性"result"。

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

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

这是不可能的;代码

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

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

有两种解决方案:

  1. 你可以使用一个容器(按照Qnan的建议)

  2. 您可以使用回调。

第二种方法意味着:不要立即使用result,而是让object.event后面的函数在result有一些有用的值时立即调用您的一些代码:

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