2016-11-06 2 views
1

Beispiel:Warum gibt bound_function.toString() den ursprünglichen Quellcode nicht zurück?

function f(a){ return a } 
var g = f.bind(null); 
g.toString() // chrome: function() { [native code] } 
      // firefox: function bound f() { [native code] } 

Gibt es einen subtilen Grund, warum g.toString() nicht, um den ursprünglichen Quellcode zurückkehrt?

Natürlich konnte ich das leicht beheben, indem ich Function.prototype.bind überging, aber meine Frage ist: mache ich etwas dummes wie das Öffnen eines Sicherheitslochs mit diesem?

var o_bind = Function.prototype.bind; 
Function.prototype.bind = function(){ 
     var f = o_bind.apply(this, arguments); 
     f.orig_func = this; 
     return f; 
} 
function fsrc(f){ 
     return f.orig_func ? 
       String(f.orig_func).replace(/^function/, '$& bound') : 
       String(f); 
} 
+4

Nun, '.bind' gibt eine neue Funktion zurück. –

+0

@FelixKling, Sie sind richtig, aber 'f.toString()! = G.toString()' :) (die 'bind' gibt wahrscheinlich eine native Funktion zurück, die beim Aufruf den eigentlichen Aufruf der ursprünglichen Funktion mit dem relevanten' thisArg') – Dekel

+0

@Dekel tatsächlich, dass _is_ was es tut. Eine vereinfachte Version von 'bind' besteht darin, einfach die folgende Funktion zurückzugeben: function() {return f.apply (thisArg, arguments); } '. Eine Vollversion ist nicht viel anders, würde aber die Teilzuweisungsfunktionalität handhaben. – vlaz

Antwort

2

The spec says about Function.protoype.toString (Hervorhebung von mir):

Wenn func ist ein Bound Funktion exotische Objekt, dann
Return eine Implementierung abhängigen String Quellcode Darstellung func. Die Darstellung muss den folgenden Regeln entsprechen. Es hängt von der Implementierung ab, ob die Darstellung Informationen über gebundene Funktionen oder Informationen über die Zielfunktion enthält.

Mit anderen Worten, Umgebungen können die Quelle der ursprünglichen Funktion enthalten oder nicht.


mache ich etwas Dummes wie einige Sicherheitslöcher mit dieser Öffnung?

Vorausgesetzt, dass toString den Quellcode einer Funktion für "normale" benutzerdefinierte Funktionen zurückgibt, wahrscheinlich nicht.

Verwandte Themen