2014-02-23 103 views
0

如何在javascript中動態創建函數,但變量是「動態硬編碼」(?)。最好不要使用eval()在JavaScript函數中動態創建靜態變量

我認爲這將是最簡潔的方式來傳遞async.parallel()幾個參數在nodejs中,而無需綁定對象。

function makeFunction(param1){ 

    return function(){ 
     alert(param1); 
    } 

} 
的console.log(makeFunction(的 「Hello World」))

實際輸出;

return function(){ alert(param1); }

的console.log(makeFunction(的 「Hello World」))

所需的輸出;

return function(){ alert("Hello World"); }

+2

你爲什麼要硬編碼呢?它會反正因爲clojure而堅持'Hello World'。如果再次使用「Bye World」再次調用它,它仍然會返回爲附屬於param1,但由於clojure,那裏的param1會有'Bye World' –

+1

僅僅因爲在輸出中看不到閉合範圍, param1 ===「Hello World」'。不需要在其源代碼中創建一個包含字符串文字的函數,它甚至不會比閉包更高效。 – Bergi

回答

1
function makeFunction(param1){ 
    return new Function('alert(\'' + param1 + '\');') 
} 

console.log(makeFunction('helloWorld').toString()) 

只喜歡。 new Function是一個有點「evaly」,但事實上它好多了(或者更少的邪惡)。

0

我不覺得它會比使用eval更好,但很可能這將是你想要什麼:

function makeFunction(param1) { 
    var F=function() { 
     alert(param1); 
    }; 

    var text=['"', '"'].join(param1); 
    text=String.prototype.replace.call(F, 'param1', text); 
    text=['return ', ';'].join(text); 
    return (new Function(text))(); 
}