2011-02-01 45 views
4

有沒有一種技術可以在返回後執行代碼? 我想返回一個值,然後重置該值而不引入臨時變量。在Javascript中,是否有一種技術可以在返回後執行代碼?

我當前的代碼是:

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 b在函數調用之間保存一個值,因爲它是一個memoization風格的函數。

+0

溫度永遠是真正的第一條件.... – 2011-02-01 15:29:54

+0

「`VAR B`持有函數調用之間的值」 - 不,它不需要。 – OrangeDog 2011-02-01 15:51:48

+0

似乎沒有人注意到上面的函數聲明缺少它的名字:) – 2011-02-01 15:54:13

回答

3

在Javascript中,是否有一種技術可以在返回後執行代碼?

絕對。它被稱爲setTimeout(),但不知何故,我懷疑它會是一個很好的解決方案。

這無論如何:

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

你作爲第一個參數傳遞給setTimeout功能將「關閉圍繞」 b變量,經過20毫秒設置。

如果您想保留代碼執行的同步流程,那麼絕對不會,除非您通過隨期望值一起返回的函數手動執行。

最終,你最好的選擇將是temp變量。如果你願意,你可以關閉它周圍像b變量:

​​
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,其次,因爲我們在Javascript中有一個詞法函數作用域,所以當函數結束時,b總會失去它的值。

所以我想你正在利用閉包來保存對該變量的引用。但它不可能在沒有看到你的實際代碼的情況下回答

3

使用finally塊來確保某些代碼另一個塊後運行。該塊可以包含錯誤,退貨或其他任何內容。 finally塊會在後面運行。

try { 
    return 'something'; 
} finally { 
    // your after return code 
} 
相關問題