2015-08-10 4 views
19

in diesem Zusammenhang zugegriffen werden kann ich eine einfache Debugging-Funktion zu erstellen, versuche, die einfach den Anrufer einer Funktion zeigt, wie folgt aus:‚Anrufer‘ und ‚Argumente‘ sind Funktionseigenschaften beschränkt und nicht

function xe() { 
    console.log(xe.caller().name) 
} 

Mit das würde ich einfach in der Lage sein, xe() zu einer Funktion hinzuzufügen, und es wird die Aufrufe der Funktion protokollieren - nur eine kurze, einfache Ergänzung, um beim Debuggen zu helfen. Zucker sozusagen debuggen.

Leider bekomme ich den Fehler aus der Betreffzeile:

TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.

I Babel/ES6 verwenden, die "use strict" an der Spitze jeden Moduls einspritzt. Diese kann die Ursache sein, aber die Suche hat begrenzte Informationen darüber ergeben, warum der Fehler ausgelöst wird, und ich möchte es besser verstehen.

Wenn der strikte Modus das Problem ist, möchte ich den strikten Modus für das gesamte Projekt nicht deaktivieren - nur für das Modul/die Funktion.

+2

Sie möchten wirklich Ihren '.caller' anrufen? – Bergi

+1

Siehe auch [Wie bekomme ich den Anrufer vom strikten Modus?] (Http://stackoverflow.com/q/9777905/1048572) und [Wie finden Sie die Anruferfunktion in JavaScript heraus?] (Http: // stackoverflow.com/q/280389/1048572) – Bergi

+0

''Strenge' 'an der Spitze jedes Moduls tatsächlich verwenden –

Antwort

22

Es ist die Ursache. From MDN:

in strict mode it's no longer possible to "walk" the JavaScript stack via commonly-implemented extensions to ECMAScript. In normal code with these extensions, when a function fun is in the middle of being called, fun.caller is the function that most recently called fun, and fun.arguments are the arguments for that invocation of fun. Both extensions are problematic for "secure" JavaScript because they allow "secured" code to access "privileged" functions and their (potentially unsecured) arguments. If fun is in strict mode, both fun.caller and fun.arguments are non-deletable properties which throw when set or retrieved:

Wenn Sie ES6 tun, können Sie in den allgemeinen Fall nicht Strict-Modus deaktivieren. Es ist implizit während certain conditions wie in einem ES6-Modul.

Wenn Sie gerade debuggen, würde ich vorschlagen, nur einen Breakpoint in einem Debugger zu verwenden und den Stapelrahmen zu überprüfen, aber ich bin sicher, dass Sie das bereits wissen.

Wenn Sie gerade die Ausgabe Debug-Informationen auch Sie könnten, nehme ich an habe gerade gelesen, den Stapel eines Error-Objekt:

console.log(new Error().stack); 

Sie können globaly disable (aber ich weiß, das ist nicht das, was Sie wollen) use strict mit babel verwenden entweder:

require("6to5").transform("code", { blacklist: ["useStrict"] }); 

oder

$ 6to5 --blacklist useStrict 

Wenn Sie es auf Modulebene entfernen müssen, vermute ich, dass Sie es selbst tun müssen. Basic String ersetzen vielleicht?

Zusätzlich, wie in ES5 hingewiesen wurde. Es sollte xe.caller.name und nicht xe.caller().name sein oder Sie würden die Funktion erneut aufrufen.

1

Gemäß this Dokumentation. Die Function.caller()-Eigenschaft gibt die Funktion zurück, die die angegebene Funktion aufgerufen hat. Sie erhalten einfach die ganze Anruferfunktion, wenn Sie xe.caller verwenden. Auch hier führen Sie die Anruferfunktion aus. Hier machen Sie Rekursion und das ist der Grund, warum es nicht im strikten Modus erlaubt.

Sie können Ihre Beispielfunktion in der Browser-Konsole ausführen. Sie erhalten Maximum call stack size exceeded Fehler.

Verwandte Themen