2016-05-19 77 views
1

我試圖解決https://twitter.com/secoif/status/730207047892017153當我收到一條錯誤消息,我不明白。運行此代碼無法映射綁定到陣列

const fns = [ 
    function() { 
    console.log(1) 
    }, 
    function() { 
    console.log(2) 
    }, 
    function() { 
    console.log(3) 
    } 
] 

fns.map(Function.prototype.call.bind) 

鉻告訴我,這一點我不明白「綁定必須在函數調用」當我得到的錯誤。下面這行應該是等效的,不會拋出相同的錯誤。

fns.map((x) => Function.prototype.call.bind(x)) 
+1

相關[如何將原型上定義的方法傳遞給Array.map作爲回調](http://stackoverflow.com/questions/33006222/how-to-pass-the-method-defined-on-prototype-to -array-map-as-callback) – Tushar

+0

@Tushar有趣,但如果原因是map傳遞了兩個參數,我看不到爲什麼'fns.map((x,y)=> Function.prototype.call.bind (x,y))'會起作用 – xuanji

+1

'bind'沒有綁定到'call'。如果你想做'fns.map(Function.prototype.bind,Function.prototype.call)'而不是'fns.map(Function.prototype.bind.bind(Function.prototype.call))'更喜歡那個) – Bergi

回答

0

爲了解決JS突擊測驗,你可以這樣做:

for (var x in fns) fns[x](); 

不過,我知道這不是你問:)。

有幾件事情我不明白你的方法:

1)你爲什麼要使用.MAP()? Map用於返回另一個不需要的數組,爲什麼不使用forEach()呢?

2)我不知道你爲什麼使用綁定。使用map()時,回調會傳遞3個參數:當前函數,數組中函數的索引以及數組本身。當你看看bind()的語法時,你會注意到綁定的第一個參數是'this'對象,後面跟着被綁定到的函數中傳遞的參數。在這種情況下,'this'將被設置爲當前函數,索引和數組將作爲參數傳遞給函數。

3)使用綁定的調用。 call()將採用與bind()相同的參數,其中第一個參數是this,其餘參數是傳遞給被調用的函數。當您使用.bind()時,它會將'this'對象設置爲函數,並且第一個參數將作爲索引。所以從.call()的角度來說,你將它設置爲函數的'this',並將索引作爲第一個參數傳遞給call(),這就是調用的'this',然後將整個數組作爲函數的第一個參數。

長話短說,你會讓你的價值觀混淆起來,並且讓你過度複雜化。

0

從文檔mdn docs for map

thisArg可選。在執行回調時使用此值。 默認值是Window對象

如前標記後,可以映射:

fns.map(Function.prototype.call.bind, Function.prototype.call.bind) 

如果您撥打:

fns.map(Function.prototype.call.bind) 

綁定適用於對象無法正常工作!並引發錯誤,因爲對象沒有綁定方法。