2016-07-24 17 views
3

Hinweis, Verwandte Value of this inside object method?Function.prototype.call nicht setzen Sie diese nicht bei Pfeil Funktion

Gegeben

var obj = { 
    property: 5, 
    func1: function() { 
    console.log(this.property); 
    }, 
    func2:() => { 
    console.log(this.property); 
    } 
} 

thisWindow bei obj.func2() wäre.

versucht Wenn this zu objFunction.prototype.call() mit Einstellung war this noch Window

var obj = { 
 
    property: 5, 
 
    func1: function() { 
 
    console.log(this.property); 
 
    }, 
 
    func2:() => { 
 
    console.log(this.property); 
 
    } 
 
} 
 

 
obj.func2.call(obj);

  1. Ist das erwartete Verhalten?

  2. Warum Function.prototype.call() nicht gesetzt die context von obj.func2-obj?

+4

'this' für Pfeil Funktionen aus dem äußeren Kontext erfasst, so dass es ein erwartetes Verhalten ist. – zerkms

+0

@zerkms 'Function.prototype.call',' Function.prototype.apply' kann 'context' nicht einstellen:' this' von Pfeilfunktionen? – guest271314

+1

Nein, http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-funktions-definitions-runtime-semantics-evaluation – zerkms

Antwort

4

Es ist, als je erwartet the standard

Ein ArrowFunction definiert keine lokale Bindungen für Argumente, super, dieses oder new.target. Jede Bezugnahme auf arguments, super, this oder new.target innerhalb einer ArrowFunction muss zu einer Bindung in einer lexikalisch umschließenden Umgebung aufgelöst werden.

Das bedeutet - Sie können nicht etwas festlegen, das nicht definiert ist.

Auch relevant:

Die Funktionen mit dem [[Call]] internen Steckplatz genannt werden, die die this Bindung als

  1. OrdinaryCallBindThis(F, calleeContext, thisArgument) Führen setzt.

Was wiederum checks

  1. thisMode der Wert F ‚s [[ThisMode]] internen Steckplatz sein lassen.
  2. Wenn thisMode lexikalisch ist, geben Sie NormalCompletion(undefined) zurück.

Also, intern hat es eine zusätzliche Prüfung, ob die Funktion lexikalische wird (Pfeil-Funktion) oder nicht.

Referenzen: