2017-05-28 3 views
0

Im Folgenden finden Sie die Liste der Debugger-Abfragen und Antworten in einem node.js auf globale Bereichsebene ausgeführt:Node.js Globaler Scope

this.toString() 
 
    "[object Object]" 
 
Object.getPrototypeOf(this).toString() 
 
    "[object Object]" 
 
Object.getPrototypeOf(Object.getPrototypeOf(this)) 
 
    null 
 
this.constructor 
 
    function Object() { [native code] } 
 
Object.prototype.toString() 
 
    "[object Object]" 
 
Object.prototype.toString.call(this) 
 
    "[object Object]" 
 

 
Function.prototype.toString() 
 
    "function() {}" 
 
Function.prototype.toString.call(this) 
 
    TypeError: Function.prototype.toString is not generic

Der erste Satz von Antworten darauf hin, dass Der globale Gültigkeitsbereich wird durch ein Objekt repräsentiert, das Object.prototype erwartungsgemäß erweitert. Ich würde also erwarten, dass das Aufrufen von Function.prototypes .toString() auf dieses fehlschlagen würde, wie es tatsächlich tut (siehe die letzte Abfrage). Ich habe erwartet, dass die Abfrage voraus, dass eine implizite diese übergeben und so ebenfalls fehlschlagen, aber es gibt function() {}.

Warum der Unterschied, und welche Funktion wird in der Antwort referenziert?

+0

Die zweite bis letzte entspricht "Function.prototype.toString.call (Function.prototype)". Der Wert von "this" aus dem globalen Bereich wird von diesem nicht verwendet. –

Antwort

0

In einem Funktionsaufruf wird this entweder an das Objekt gebunden, dass „die Funktion aufgerufen wurde auf“ oder das globale Objekt, zum Beispiel:

const obj = { 
    foo() { 
    console.log(this); 
    }, 
}; 

obj.foo(); // this is bound to obj 
const obj2 = {}; 
obj2.bar = obj.foo; 
obj2.bar(); // this is bound to obj2 
const g = obj.foo; 
g(); // this is bound to the global object 

Daher Function.prototype.toString() genau wie Function.prototype.toString.call(Function.prototype) gleich ist. Das ist die Frage der Implementierung dieser Funktion, die sie auslöst, wenn sie auf etwas anderem als einer Funktion aufgerufen wird.