2011-02-01 13 views
4

ありますか? 一時的な変数を導入せずに値を戻したい場合は、値をリセットします。、私は復帰後のコードを実行できる技術がありますか?私は帰国後のコードを実行できる技術が

私の現在のコードは次のとおりです。

var foo = (function(){ 
    var b; 

    return { 
    bar: function(a) { 
     if(b){ 
      var temp = b; 
      b = false; 
      return temp; 
     }else{ 
      b = a; 
      return false; 
     }; 
    } 
    }; 
})(); 

foo.bar(1); 

私はtemp VARを避けたいです。それは可能ですか?それはメモ化スタイル機能であるため、

var bは、関数呼び出しの間の値を保持します。

+0

第1の条件では、常にテンポは.... –

+0

「var bは関数呼び出しの間の値を保持する」 - そうではありません。 – OrangeDog

+0

上記の関数宣言にその名前がないことに誰も気づいていないようです:) –

答えて

3

JavaScriptでは、リターン後にコードを実行できる方法はありますか?

絶対に。それはsetTimeout()と呼ばれていますが、どういうわけか私はそれがあなたのために良い解決策になることを疑います。

は、ここでは、とにかくです:あなたはsetTimeoutに最初の引数として渡された関数は「周りのクローズ」b変数、および20ミリ秒後に設定します

var foo = (function(){ 
    var b; 

    return { 
    bar: function(a) { 
     if(b){ 
      setTimeout(function() {b = false;},20); 
      return b; 
     }else{ 
      b = a; 
      return false; 
     }; 
    } 
    }; 
})(); 

foo.bar(1); 

コード実行の同期フローを保持する場合は、必要な値とともに返される関数を使用して手動で実行する場合を除き、絶対に実行しないでください。

最終的には、temp変数が最適です。

​​
+0

なぜ20ミリ秒で0でないのですか? 0を置いても関数が返った後でも実行することが保証されています。 – Paulpro

2

bには、機能内にvarと宣言しているため、実際には何も設定していません。関数の外には存在しません。

0

私はこのコードについては何も理解していない...しかし、ここにあなたがこれを行うことができます:

function(a) { 
    var b; 
    // I suppose b is defined here ? 

    if(b) 
    { 
     b = false; 
     return !b; 
    } else { 
     b = a; 
     return false; 
    }; 
}; 
0

私は私が今までこのようなものを使用するとは思わないが、あなたがのための関数を書くことができそれ:

var foobar = function(value, callback) { 
    callback(); 
    return value; 
}; 

その後、それはあなたのコード内でこのように使用されます:

function(a) { 
    var b; 

    if (b) { 
    // The first argument is what you want returned. 
    // The second argument is a function that you want executed "after" you've calculated the return value 
    return foobar(b, function() { 
     b = false; 
    }); 
    } else { 
    b = a; 
    return false; 
    }; 
}; 

私はそれを呼ばfoobar私はこのコンセプトの名前を単純に考えることができないからです:)

実際にコードが実際の復帰後に実行されるわけではありませんが(それは不可能です)、最終的に復帰値の値を取得します関数が実行され、結果としてあなたの後ろのもののようになります。

しかし、再び、私はこのようなものを使用することをアドバイスしたい場合は本当にわからない:)

0

私はこれが可能ではないと思われる(または私はそれを行う方法がわかりません) 。あなたが欲しいもの(つまり変数をリセットする)を行い、それを使う関数を作成しようとします。return reset_variables();

関数 'reset_variables'は、あなたが望む値も返します。

2

あなたは本当にここにあなたの完全なコードを表示する必要があります。あなたの例では、bは常にundefinedなので、条件式は常にelse caseと入力されます.2番目に、JavaScriptの字句関数スコープがあるので、bは関数が終了すると常にその値を失います。

だから私は、あなたがその変数への参照を保持するために、クロージャの利点を取っていると思います。しかし、あなたの実際のコードを見ずに答えることは不可能です。

+0

完全なコード例を追加しました。 –

3

は最終的に、特定のコードが別のブロックの後に実行を保証するためにブロックを使用します。ご希望の場合は、b変数のようにその周りに閉じることができます。そのブロックには、エラー、リターンなどが含まれます。 finallyブロックは後に実行されます。

try { 
    return 'something'; 
} finally { 
    // your after return code 
}