2015-07-27 4 views
9

Ich versuche Pfeil Funktionen in ECMAScript 6.Diese Werte für Pfeil Funktionen

Dies ist die Definition, die ich über kam zu verstehen beim Lesen: haben

Pfeil Funktionen implizite this Bindung, was bedeutet, dass die Wert des this Wertes innerhalb einer Pfeilfunktion ist immer der gleiche wie der Wert this in dem Bereich, in dem die Pfeilfunktion definiert ist!

Nach der Definition, wie ich glaube this für ein arrow function die gleichen Block-Level-Werte enthalten soll, die der Pfeil Funktion in definiert wurde

Code:.

var test = { 
    id: "123123", 
    k: { 
    laptop: "ramen", 
    testfunc:() => console.log(this) 
    } 
} 

console.log(test.k.testfunc); 

Aber ich bin immer Dieses Ergebnis aus dem Code

function testfunc() { 
    return console.log(undefined); 
} 

Was ich dachte, ich würde g et würde eine Leistung von sein:

{"laptop": "ramen"} 

, wenn ich dies laufe

console.log(test.k.testfunc());

+0

Bei Verwendung von 'console.log (test.k.testfunc());' in FF (beachten Sie die Klammern am Ende), bekomme ich einen Verweis auf Fenster. Das ist richtig, da bei der Definition der Funktion der aktuelle Bereich in meinem Fall "Fenster" war. – Sirko

+0

Dies sollte helfen zu erklären: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions "this". Siehst du was ich dort gemacht habe? – LDJ

Antwort

4

Lassen Sie sich in den äquivalenten ES5 Code umwandeln:

var test = { 
    id: "123123", 
    k: { 
    laptop: "ramen", 
    testfunc: function(){return console.log(this)}.bind(this) 
    } 
} 

Denken Sie daran, dass this auf abhängt, wie Du rufst die Funktion an. Der äußere this befindet sich nicht in einer Funktion, daher wird er im strikten Modus standardmäßig auf undefined gesetzt.

Vereinfachte Szenario unter:

console.log(this) // undefined 

var test = { 
    a: this // same `this` as above 
} 
+0

@nateabarbettini Arrow-Funktionen erben 'dies' von ihrem einschließenden Bereich (Funktionsumfang), so interessant wird dies funktionieren - testfunc: function() {() => {console.log (this)}()} –

2

Sie definieren den Pfeil Funktion im gleichen Umfang, die Sie var test definiert. Wenn Sie test im globalen Gültigkeitsbereich definieren, ist der Kontext der Pfeilfunktion ebenfalls der globale Gültigkeitsbereich.

Wenn Sie Test innerhalb einer Methode definieren, teilt die Pfeilfunktion den Kontext der Methode.