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にアタッチするか、コールバックをに渡すことができるはずです:onreadystatechangeaFunc

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によって返されることです。これは、クロージャ内で発生するその後の の変更は、以前に返された に影響を与えないことを意味します。aFuncresultresult

于 2012-08-27T14:57:36.563 に答える
2

これは不可能です。コード

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

は実際には実行されず、 に設定されるresult = true;関数を定義するだけです。関数を呼び出す前に使用すると、未定義の値が生成されます。resulttrueresult

次の 2 つの解決策があります。

  1. コンテナを使用できます(Qnanの提案による)

  2. コールバックを使用できます。

2 番目のアプローチは、次のことを意味します。すぐに使用する代わりに、有用な値が得られるとすぐに、result背後の関数にobject.eventコードを呼び出させます。result

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