2016-03-14 10 views
7

Ich bekomme einen seltsamen Fehler beim Versuch, Array.from zu Array.prototype.map zu übergeben.Array.from TypeError: 0 ist keine Funktion

let fn = Array.from.bind(Array); // [Function: bound from] 

fn('test') // [ 't', 'e', 's', 't' ] 

['test'].map(s => fn(s)) // [ [ 't', 'e', 's', 't' ] ] 

['test'].map(fn) // TypeError: 0 is not a function 

Full Error:

TypeError: 0 is not a function 
    at Function.from (native) 
    at Array.map (native) 
    at repl:1:10 
    at REPLServer.defaultEval (repl.js:260:27) 
    at bound (domain.js:287:14) 
    at REPLServer.runBound [as eval] (domain.js:300:12) 
    at REPLServer.<anonymous> (repl.js:429:12) 
    at emitOne (events.js:95:20) 
    at REPLServer.emit (events.js:182:7) 
    at REPLServer.Interface._onLine (readline.js:211:10) 

Was ist los?

Antwort

9

ruft seinen Callback mit drei Argumenten auf: Der Eintrag, der Index und das Objekt, über das iteriert wird. Array.from erwartet, dass, wenn ein zweites Argument gegeben wird, es eine Mapping-Funktion ist und versucht, sie auf jedem "Element" aufzurufen, aus dem das Array aufgebaut wird. Der Index 0 beim ersten Aufruf ist keine Funktion, daher schlägt Array.from fehl.

anders ausgedrückt, um das Äquivalent von

['test'].map(fn) 

nicht

['test'].map(e => fn(e)) 

sondern

['test'].map((e, i, a) => fn(e, i, a)) 

ist ... wo e der Eintrag ist, ist i seinen Index und a ist das "Array", das vondurchlaufen wird. Da i keine Funktion ist, schlägt Array.from fehl.

erhalten Sie die gleiche Art von Ding mit mehreren anderen Array-Funktionen, wie forEach, some ...


Wenn Sie dies tun eine Menge, können Sie finden es sinnvoll, eine Funktion haben Sie verwenden können alle, aber das erste Argument zu filtern:

function passOneArg(f) { 
    return function(a) { return f.call(this, a); }; 
} 

, die Sie wie folgt verwenden können:

['test'].map(passOneArg(fn)) 

Oder vielleicht sogar

function limitArgs(f, count) { 
    return function() { 
     return f.apply(this, Array.prototype.slice.call(arguments, 0, count)); 
    }; 
} 

dann

['test'].map(limitArgs(fn, 1)) 

Diese sind, natürlich, zwei der schlimmsten Funktionsnamen auf dem Planeten, aber Sie bekommen die Idee ... :-)

Verwandte Themen