2017-02-28 23 views
-1

所以我想創建一個function陣列調用一個函數從基陣

  1. 這需要在一個字符串數組
  2. 這些字符串轉換爲功能
  3. 然後能從數組調用時返回功能

到目前爲止,我的代碼如下所示:

function funcArrays(stringArray){ 
     var funcArray = []; 
     for(var i in stringArray){ 
     var name = stringArray[i]; 
     var func = new Function(
      "return function(num){ return"+" "+name+"; };" 
      )(); 
     funcArray.push(func()); 

     } 
     return funcArray; 
} 

當我通過這個function

var strings = ['One', 'Two', 'Three', 'Four', 'Five']

然而,當我嘗試這個數組傳遞給我的函數像這樣的數組:

var functionalArrayPositionOne = funcArrays(strings)

我得到這樣的:

Uncaught ReferenceError: One is not defined at eval (eval at funcArrays (:5:14), <anonymous>:2:30) at guestListFns (<anonymous>:8:18) at <anonymous>:1:9

而我希望能夠做的是這樣的:

var functionalArrayPositionOne = funcArrays(strings)

那麼做到這一點: functionalArrayPositionOne[0]()

而且有這個返回function's輸出

+0

對不起,如果我錯過了,但'guestListFns(字符串)'在哪裏? –

+0

此外,在這一行'新函數( 「返回函數(num){return」+「」+ name +「;};」 )()'你正在調用你創建的函數,所以你沒有函數 –

+0

好的結果我改變了所有的名字 –

回答

0

這就是你'之後?

而且我也有興趣知道爲什麼想要這樣做?

var numbers = ['one', 'two', 'three']; 

function functionise(values) { 
    return values.map(function (value) { 
    return function() { 
     return value; 
    }; 
    }); 
} 

functions = functionise(numbers); 

console.log(functions[0]()); // one 
console.log(functions[1]()); // two 
console.log(functions[2]()); // three 
0

你的錯誤的出現是因爲:

function funcArrays(stringArray){ 
    var funcArray = []; 
    for(var i in stringArray){ 
    var name = stringArray[i]; 
    var func = new Function(
     "return function(num){ return"+" "+name+"; };" 
     )(); // this call 
    funcArray.push(func()); 
    // here you end up calling 'One' which is not a function 

    } 
    return funcArray; 
} 
  1. 你打電話給你剛纔創建的功能,因此你必須返回的值,而不是這似乎是你要求的功能。

  2. 如果使用函數構造函數,將無法訪問在範圍中創建的變量。所以你得到了Uncaught ReferenceError: One is not defined


function funcArrays(stringArray){ 
    var funcArray = []; 
    for(var i in stringArray){ 
    var func = function() { 
     var name = stringArray[i]; 
     return function() { //[1] 
     return (function() { //[2] 
      return name //[3] 
     })() 
     } 
    } 
    funcArray.push(func()); 
    } 
    return funcArray; 
} 

其中可用於像這樣:

var functionalArrayPositionOne = funcArrays(['One', 'Two', 'Three'])[0] 
functionalArrayPositionOne() 
// prints 'One' 

但爲什麼3層的功能呢?

如果你通過這個案例看到:

var func = function() { 
    return function() { 
    return name 
    } 
} 

在funcArray的價值將是:

function() { 
    return name 
} 

後你的循環的整個執行,你會看到的name的最後一個值。

因此凍結name值我用了一個IIFE [2]

+1

爲什麼有必要使用'Function'構造函數呢? – 2017-02-28 02:59:23

+0

這不是,我只是指出OP爲什麼會出現這個錯誤。 :)我個人不喜歡這樣做。 –

0

你最終執行的函數實際上是

function(num) { return One; } 

,是的,One確實是不確定的,因此你的錯誤。如果你想在函數返回'One',那麼你需要寫:

var func = new Function(
    "return function(num){ return '" + name + "'; };" 
)(); 

注單引號。像你想這將產生一個功能:

function(num) { return 'One'; } 

順便說一句,在這種情況下,往往更具可讀性使用模板字符串:

`return function(num) { return '${name}'; }` 

但實際上,你並不需要使用Function構造函數完全可以創建函數;我們已經有function關鍵字來做到這一點。因此,而不是

var func = new Function(
    "return function(num){ return"+" "+name+"; };" 
)(); 

只要寫

但是,如果你仔細想想,你定義它返回一個函數的函數,然後立即執行該功能,這是完全一樣的剛指定函數本身,所以

var func = function(num) { return name; }; 

因爲你是在一個循環中跨strings這樣做,這是一個很好的應用map,讓你寫你的整個功能:

function funcArrays(stringArray){ 
    return stringArray.map(string => function(num) { return string; }); 
} 

採取更注重功能的做法,常常是有用寫higher-order function它創建了一個函數,它總是返回一些特殊的價值。有時候,這種功能被稱爲K

function K(v) { return function() { return v; } 

,或者,如果你喜歡

const K = v =>() => v; 

現在你可以寫你funcArrays功能僅僅作爲

function funcArrays(stringArray) { 
    return stringArray.map(K); 
} 

在一般情況下,很少有在這種情況下,您將需要使用構造函數從字符串中創建一個函數Function。如果你嘗試,你會經常發現自己困惑和麻煩。使用Function構造函數具有與使用eval大部分相同的問題,並且同樣存在問題。除其他問題外,您只能從創建的函數中訪問全局變量(或參數)。