2016-11-03 2 views
-1

Gemäß der Spezifikation ES6, die Syntax'this' innerhalb einer Vorlage wörtlichen

foo`Hello!` 

genau wie

foo('Hello!') 

Putting eine Vorlage wörtliche nach einem Ausdruck verhalten soll löst eine Funktion Aufruf , ähnlich wie eine Parameterliste (durch Kommas getrennte Werte in Klammern) einen Funktionsaufruf auslöst. Der vorhergehende Code entspricht dem folgenden Funktionsaufruf (in Wirklichkeit erhält die Funktion mehr Informationen, aber das wird später erklärt).

Source

jedoch im folgenden Ausschnitt, einen Wert einer Funktion Bindung bewirkt, dass die 2-Syntaxen unterschiedlich verhalten:

function alertParans() { alert(this) } 
 
function alertNoParans() { alert `${this}` } 
 

 
var executeParans = alertParans.bind('roman empire'); 
 
var executeNoParans = alertNoParans.bind('greek empire'); 
 

 
executeParans(); 
 
executeNoParans();

der erste Aufruf druckt ' Römisches Reich ', während die zweite immer nur ein Komma druckt. Warum?

Fiddle

+1

@Claies nein, genau darum geht es bei der Frage. Er verwendet "alert" als Tagging-Funktion (für die es natürlich nicht gedacht war). – nils

+2

[Verwenden Sie 'alert()' nicht zum Debuggen.] (Http://stackoverflow.com/questions/8203473/why-is-console-log-considered-better-than-alert) –

+0

@Claies - Nein, die Klammern sind nicht erforderlich -> https://jsfiddle.net/gcbhvqu5/1/ aber in diesem Fall lösen sie das Problem, das ist nicht das Fehlen von Klammern, sondern die Verwendung von Alarm als Tag-Funktion – adeneo

Antwort

7

Sie sollten das Beispiel Sie verknüpft lesen, da sagt es etwas anderes als Sie behaupten.

In the section it is stated that the following examples are equivalent:

tagFunction`Hello ${firstName} ${lastName}!` 
tagFunction(['Hello ', ' ', '!'], firstName, lastName) 

Nun, wenn Sie diese aufmerksam zu machen anzuwenden sind, es würde wie folgt aussehen:

function alertParans() { alert(['', ''], this); } 
function alertNoParans() { alert`${this}`; } 

var executeParans = alertParans.bind('roman empire'); 
var executeNoParans = alertNoParans.bind('greek empire'); 

executeParans(); 
executeNoParans(); 

Jetzt können Sie das Komma in beiden Fällen erhalten, als erstes Argument von alert ist jetzt immer ein Array mit zwei leeren Strings. Warum?

Weil Vorlagenliterale in den Inhalt vor ('') aufgeteilt werden, während (this) und nach ('') die Interpolation.

Verwandte Themen