2016-07-10 38 views
10

sto iniziare ad imparare la sintassi Vue.js e ECMA6, ho visto questo nel tutorial:Differenza tra nameFunction() {} e nameFunction() => {} in ECMA6

methods: { 
    someMethod: function() { 
    console.log(this) // this works 
    } 
} 

Poi ho pensato che il sintassi potrebbe essere:

methods: { 
    someMethod:() => { 
    console.log(this) // this undefined 
    } 
} 

ma questo funziona:

methods: { 
    someMethod() { 
    console.log(this) // this works 
    } 
} 

può spiegare la differenza e la sintassi ECMA5?

+0

Il terzo è un collegamento ES6 per il primo. Quando si utilizza la sintassi della freccia come nella seconda, 'this' NON è impostato per essere l'oggetto host. Questa è una delle caratteristiche della sintassi della freccia e quindi non dovrebbe essere usata quando ci si aspetta che questo sia impostato sull'oggetto host. – jfriend00

+0

Il terzo è un collegamento denominato per il primo: 'someMethod: function someMethod() {}' e 'someMethod() {}'. – dfsq

+0

@ jfriend00 si lo so ma, quale è la differenza tra il secondo e il terzo, o come è questo in ECMA5 a capire meglio la differenza –

risposta

8

Delle tre opzioni, solo la prima è supportata in ES5. Gli altri due sono aggiunte in ES6.

La terza opzione è una scorciatoia ES6 per la prima opzione e quindi funzionano in modo identico in ES6.

Quando si utilizza la sintassi della freccia come nella seconda, this NON è impostato per essere l'oggetto host così come lo è nel primo e nel terzo. Questa è una delle caratteristiche della sintassi delle frecce e quindi non dovrebbe essere usata quando ci si aspetta che this sia impostato sull'oggetto host. Invece, this sarà impostato sul contesto lessicale da cui è stato definito il codice, spesso definito come "il valore di this nel contesto di inclusione" o il "valore lessicale di questo" che nel tuo caso sarebbe stato qualsiasi this quando il l'oggetto ospitante è stato inizialmente dichiarato che apparentemente era undefined.

Ecco un buon articolo di riferimento su funzioni di direzione: ES6 In Depth: Arrow functions

+0

Aggiunti ulteriori dettagli e un articolo di riferimento. – jfriend00

1
  1. oggetto metodi quel metodo ha SomeMethod. In questo caso questo è un collegamento all'oggetto metodi.
  2. Oggetto metodi che ha la proprietà someMethod che memorizza alcune funzioni anonime. In questa funzione questo non è definito perché la funzione è anonima.
  3. Oggetto metodi ha la funzione interna someMethod. In questa funzione questo è il collegamento ai metodi , perché è una funzione con nome interno (non anonimo o esterno) di questo oggetto.

Buona fortuna!

+ Prova questo modo

var methods1 = function() { 
 
    var self = { 
 
    someMethod: function() { 
 
     console.log(self); 
 
    } 
 
    }; 
 
    return self; 
 
}(); 
 
    
 
var methods2 = function() { 
 
    var self = { 
 
    someMethod:() => { 
 
     console.log(self); 
 
    } 
 
    }; 
 
    return self; 
 
}(); 
 

 
var methods3 = function() { 
 
    function someOtherMethod() { 
 
    console.log(self); 
 
    } 
 
    var self = { 
 
    someMethod: function() { 
 
     someOtherMethod(); 
 
    } 
 
    } 
 
    return self; 
 
}(); 
 

 
methods1.someMethod(); 
 
methods2.someMethod(); 
 
methods3.someMethod();

+0

Descrivere ** questo ** come un collegamento a ** metodi ** nei casi 1 e 3 potrebbe usare la chiarificazione "questo" è impostato in fase di esecuzione all'oggetto su cui viene chiamata una funzione ordinaria (non associata "funzione"), per esempio usando il codice chiamante 'methods.someFunc()'. Tuttavia 'questo' potrebbe avere un valore diverso o addirittura indefinito se la funzione viene chiamata in un altro modo. – traktor53

+0

Ho semplificato in modo particolare la mia spiegazione perché penso che in questa fase sia molto difficile capire tutto questo per OP. Ma sono d'accordo con te. –