2017-02-23 3 views
0

Ich bin sowohl die Code-Blöcke in der Chrom-Registerkarte Konsole ausgeführt, aber ich bin nicht in der Lage zu
verstehen, warum die Ausgabe von zweiten Block NaN ist. Die Werte sollten im zweiten Fall nicht enthalten b, die Egal was ich denke ist egal.Javascript Arrow Funktion

var adder = { 
    base: 1, 

    add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
    }, 

    addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
     base: 2 
    };   
    return f.call(b,a,n); 
    } 
}; 
console.log(adder.addThruCall(3,4)); // output: 8 

Aber wenn ich

var adder = { 
base: 1, 

add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
}, 

addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
    base: 2 
    };   
    return f.call(a,n); 
} 
}; 
console.log(adder.addThruCall(3,4)); //output: NaN 
+0

Das erste Argument von fn.call() ist es, die ‚dieses ' Streit. Also 'f.call (a, n) 'ist gleichbedeutend mit dem Aufruf von' f (n, undefined) ', wobei 'a' innerhalb von f" this "ist. Daher bekommst du NaN seit Nummer + undefiniert = NaN – Shilly

Antwort

1

call als erstes Argument akzeptiert Wert, der als this (genannt context) in aufgerufenen Funktion verwendet wird. So in zweiten Beispiel (f.call(a,n)) a gilt als Kontextargument und n gilt als f Funktion erstes Argument - so als Ergebnis Ihre f Funktion wird eigentlich mit nur einem einzigen Argument aufgerufen, so das zweite Argument ist undefined - es entspricht dem Aufruf f(n) aber f Funktion erwartet zwei Argumente. Als Ergebnis innerhalb der Funktion fügen Sie die Nummer undefined, die Sie NaN gibt.

Eine weitere Sache zu klären:

seit this nicht in Pfeil Funktionen gebunden ist, wenn call Methode auf Pfeil Funktion erstes Argumente (Kontext) ignoriert ruft und es wird nicht als this Wert innerhalb Pfeil-Funktion verwendet werden aber in Ihrem zweiten Beispiel wird dazu führen, dass nicht Ihre probem und selbst wenn Sie normale Funktion Problem verwendet würde noch

+0

Da dies nicht in Pfeilfunktionen gebunden ist, wird dies vom Parameter ignoriert. Wenn ich console.log (adder.addThruCall (3,4,5)) mache, gibt es auch NaN zurück. aber es sollte eine 4 +5 +1 ie 10 haben –

+0

Nein. Wenn Sie 'f.call (a, n)' aufrufen, tun Sie das tatsächlich: 'f (n)' - 'f'-Funktion wird mit SINGLE-Argument so aufgerufen zweites Argument ist "undefiniert". Das erste Argument der Call-Methode wird nicht als Funktion, sondern als Kontext übergeben. Bitte überprüfen Sie die 'Call'-Dokumentation, um sie komplett zu verstehen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call –

0

Telefonieren() -Methode ruft eine Funktion mit einem gegebenen diesem Wert und Argumenten individuell zur Verfügung gestellt.

Anstatt Anruf zu verwenden, können Sie direkt f (a, n) zurückgeben;

+0

Ich wollte das Konzept von Call/Apply verstehen. –

1

im zweiten Teil des Codes bestehen:

var adder = { 
base: 1, 

add: function(a) { 
    var f = v => v + this.base; 
    return f(a); 
}, 

addThruCall: function(a,n) { 
    var f = (v,n) => v + n + this.base; 
    var b = { 
    base: 2 
    };   
    return f.call(a,n); 
} 
}; 
console.log(adder.addThruCall(3,4)); 

Wenn Sie konzentrieren sich auf die console.log(adder.addThruCall(3,4)) es tut:

return f.call(3, 4) // where 3 is the context specified and 4 is the argument 

das heißt, Sie genannt,

f(4, undefined) // called with 4 

Nicht nur das, Sie kehren zurück:

v + n + this.base 

so jetzt,

Diese

Das NaN


Zur besseren Visualisierung Einsatz ist:

addThruCall: function(a,n) { 
var f = (v,n) => { 
    console.log(v, n, this.base) 
    return v + n + this.base; 
} 
var b = { 
    base: 2 
};   
return f.call(a,n); 
} 

Lösung:

addThruCall: function(a,n) { 
    var f = (v=0,n=0) => v + n + this.base; 

    var b = { 
     base: 2 
    };   
    return f.call(a,v,n); 
    } 
+0

In diesem Fall Wenn ich console.log mache (adder.addThruCall (3,4,5)); Es sollte mir ein Ergebnis zurückgeben, aber es gibt NaN zurück. –

+0

Weil 'f' nicht' n' als Argument erhalten hat. 'f.call (a, n)' ist das Problem, es liefert nicht das zweite Argument für 'f'. 'f.call' würde 3 Argumente benötigen, um das zu tun, was Sie tun wollen. –

+0

Ich glaube, ich habe es Wenn ich var Addierer halten = { Basis: 1, Add: function (a) { var f = v => v + this.base; Rückkehr f (a); }, addThruCall: Funktion (x, y) { var f = (v, n) => v + n + this.base; var b = { Basis: 2 }; Rückgabe f.call (x, y, 2); } }; console.log (adder.addThruCall (3,4,5)); // O/P 7 –