2017-12-27 40 views
-1

Ich habe die Methode zum Anwenden in Javascript nicht verstanden. Von dem, was ich verstanden habe, war der erste Parameter in der Anwendung der gewünschte Wert für das Schlüsselwort this, und der zusätzliche Parameter würde für die Funktion gelten, die geliehen wurde. Ich bin mir noch nicht sicher, wie diese Methode unter der Haube Anwendung findet. Wie kann das Ergebnis sein [1, 2, 3, 4, 5, 6, 7, 8]Wie wird die 'apply' Methode unter der Haube ausgeführt?

var flattenedArray = [[1,2],[3,4,5,6], 7, 8] 
[].concat.apply([],flattenedArray) 

Kann mir jemand helfen, wie es auf diesem scenerio tatsächlich funktioniert, bitte. Danke

+1

Jeder Funktion ist ein Kontext zugeordnet. Es wird als '[[methodName, context, args]]' dargestellt. Sie ersetzen diesen "Kontext" – Rajesh

+0

'apply' nimmt Argumente als ein Array, und' flattenedArray' ist zufällig eine - perfekte Übereinstimmung. – gurvinder372

Antwort

0

Das Ergebnis [1, 2, 3, 4, 5, 6, 7, 8] ist nicht der Wert von Function#apply, aber die Funktion Array#concat.

apply ruft nur die Funktion auf dem explizit gebundenen Kontext auf und nimmt optional Parameter als Array, die an die Funktion übergeben werden.

Wenn Sie passieren [[1,2],[3,4,5,6], 7, 8] an die Funktion apply wird es um die inneren Elemente (die äußere, die die inneren Elemente hält betrachtet wird der Typ des zweiten Parameters apply zu sein, die ein Array ist, also warum es bekommt die inneren Elemente eins nach dem anderen und lassen Sie das äußere Array weg, das sind [1,2], [3,4,5,6], 7 und 8 an die Funktion concat.

Siehe das Beispiel. Die folgenden zwei Aufrufe von concat sind identisch.

const flattenedArray = [[1,2],[3,4,5,6], 7, 8]; 
 

 
const first = [].concat.apply([],flattenedArray); 
 
console.log(first); 
 

 
const second = [].concat([1,2], [3,4,5,6], 7, 8); 
 
console.log(second);

+0

So von Ihrem Beitrag, und was ich über "anwenden" -Methode verstand, war, dass es integrierte Methode [] .Concat geliehen, um die Elemente des äußeren Array zu verketten. (In diesem Fall hält das Äußere die inneren Elemente ([1,2], [3, 4, 5,6], 7, 8).). Danke –

+0

@AnNice Ja, Sie haben Recht –

0
var flattenedArray = [[1,2],[3,4,5,6], 7, 8] 
[].concat.apply([],flattenedArray) 

     // [].concat.apply([],flattenedArray) 
 
var concat = [].concat // ^^^^^^^^^ 
 
var me = []    //     ^^ 
 

 
         // [[1,2],[3,4,5,6], 7, 8] 
 
var arg0 = [1,2]  // ^^^^^ 
 
var arg1 = [3,4,5,6] //  ^^^^^^^^^ 
 
var arg2 = 7   //     ^
 
var arg3 = 8   //     ^
 

 
me.concat = concat 
 
var res = me.concat(arg0, arg1, arg2, arg3) 
 
delete me.concat 
 

 
console.log(res)

function concat(...args) { 
 
    var res = [] 
 
    
 
    for (var x of this) { 
 
    res.push(x) 
 
    } 
 
    
 
    for (var arg of args) { 
 
    if (arg instanceof Array) { 
 
     for (var x of arg) { 
 
     res.push(x) 
 
     } 
 
    } else { 
 
     res.push(arg) 
 
    } 
 
    } 
 
    
 
    return res 
 
} 
 

 
console.log(concat.apply([], [[1,2], [3,4,5,6], 7, 8]))

Verwandte Themen