Thunk函數的使用 編譯器的求值策略通常分為傳值調用以及傳名調用, Thunk 函數是應用於編譯器的傳名調用實現,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體,這個臨時函數就叫做 Thunk 函數。 求值策略 編譯器的求值策略通常分為傳值調用以及傳名調用,在下面的例子中,將一個表達式作為參數進行傳遞,傳值調用以及傳名調用中實現的方式有所不同。 var x = 1; function s(y){ console.log(y + 1); // 3 } s(x + 1); 在上述的例子中,無論是使用傳值調用還是使用傳名調用,執行的結果都是一樣的,但是其調用過程不同: 傳值調用:首先計算 x + 1 ,然後將計算結果 2 傳遞到 s 函數,即相當於調用 s(2) 。 傳名調用:直接將 x + 1 表達式傳遞給 y ,使用時再計算 x + 1 ,即相當於計算 (x + 1) + 1 。 傳值調用與傳名調用各有利弊,傳值調用比較簡單,但是對參數求值的時候,實際上還沒用到這個參數,有可能造成沒有必要的計算。傳名調用可以解決這個問題,但是實現相對來說比較複雜。 var x = 1; function s(y){ console.log(y + 1); // 3 } s(x + 1, x + 2); 在上面這個例子中,函數 s 並沒有用到 x + 2 這個表達式求得的值,使用傳名調用的話只將表達式傳入而並未計算,只要在函數中沒有用到 x + 2 這個表達式就不會計算,使用傳值調用的話就會首先將 x + 2 的值計算然後傳入,如果沒有用到這個值,那麼就多了一次沒有必要的計算。 Thunk 函數就是作為傳名調用的實現而構建的,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體,這個臨時函數就叫做 Thunk 函數。 var x = 1; function s(y){ console.log(y + 1); // 3 } s(x + 1); // 等同於 var x = 1; function s(thunk){ console.log(thunk() + 1); // 3 } var thunk = funct...