2015-07-27 4 views
9

sto cercando di capire le funzioni di direzione in ECMAScript 6.Questi valori per le funzioni di direzione

Questa è la definizione mi sono imbattuto durante la lettura:

funzioni Freccia avere implicita this vincolante, il che significa che il il valore del valore this all'interno di una funzione freccia è lo uguale al valore di this nell'ambito in cui è definita la funzione di freccia !

Secondo la definizione, credo this un arrow function deve contenere questi valori a livello di blocco che la funzione freccia è stata definita nel

Codice:.

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

console.log(test.k.testfunc); 

Tuttavia, io sono sempre questo risultato dal codice

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

Quello che pensavo avrei g et sarebbe una potenza di:

{"laptop": "ramen"} 

se ho eseguito questo

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

+0

Quando si utilizza 'console.log (test.k.testfunc());' in FF (si noti la parentesi alla fine), ottengo un riferimento alla finestra. Quale è corretto come quando si definisce la funzione, l'ambito corrente era 'window' nel mio caso. – Sirko

+0

questo dovrebbe aiutare a spiegare: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions "questo". Vedi cosa ho fatto lì? – LDJ

risposta

4

Trasformiamo nel codice ES5 equivalente:

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

Ricorda che this dipende come tu chiami la funzione. L'esterno this non si trova all'interno di una funzione, pertanto verrà impostato come predefinito su undefined in modalità rigorosa.

scenario semplificato di seguito:

console.log(this) // undefined 

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

@natebarbettini Le funzioni di freccia ereditano 'this' dal loro ambito di inclusione (scope della funzione), così interessante, questo funzionerà - testfunc: function() {() => {console.log (this)}()} –

2

si sta definendo la funzione freccia nello stesso ambito che è stato definito var test. Se si sta definendo test nell'ambito globale, anche il contesto della funzione freccia sarà lo scopo globale.

Se si sta definendo il test all'interno di un metodo, la funzione freccia condividerà il contesto del metodo.