10 Stimmen

Abrufen des Bereichs des Funktionsaufrufers

Ich habe eine Funktion, die irgendwo in Zeile 1433 von ExtJS bricht.

var createDelayed = function(h, o, scope){
console.log(arguments); //logs undefined all round. 
    return function(){
        var args = Array.prototype.slice.call(arguments, 0);
        setTimeout(function(){
            h.apply(scope, args);
        }, o.delay || 10);
    };
};

Gibt es eine Möglichkeit zu sehen, in welcher Zeile eine Funktion ausgeführt wird, und zwar innerhalb der Funktion selbst?

(da es sich um eine Drittanbieter-Lib handelt, und ich kann nicht wirklich

var me =this;

und Protokoll me )

17voto

pimvdb Punkte 146174

Es gibt arguments.callee.caller die sich auf die Funktion bezieht, die die Funktion aufgerufen hat, in der Sie auf diese Eigenschaft zugreifen. arguments.callee ist die Funktion selbst.

Es gibt keine Möglichkeit, den Bereich der ursprünglichen Funktion zu erhalten, ohne ihn zu übergeben. Im folgenden Beispiel können Sie den this Wert innerhalb foo (abgesehen davon, dass ich weiß, dass es nichts Besonderes ist mit this hier):

function foo() {
    bar();
}

function bar() {
    console.log(arguments.callee);        // bar function
    console.log(arguments.callee.caller); // foo function
}

foo();

Dokumentation


Um die Zeilennummer zu erhalten, wird es schwieriger, aber Sie können einen Fehler auslösen und sich den Stack-Trace ansehen: http://jsfiddle.net/pimvdb/6C47r/ .

function foo() {
    bar();
}

function bar() {
    try { throw new Error; }
    catch(e) {
        console.log(e.stack);
    }
}

foo();

Für den Fiddle wird etwas Ähnliches wie das Folgende in Chrome protokolliert, wobei am Ende der Zeile die Zeilennummer und die Zeichenposition angegeben werden:

Error
    at bar (http://fiddle.jshell.net/pimvdb/6C47r/show/:23:17)
    at foo (http://fiddle.jshell.net/pimvdb/6C47r/show/:19:5)
    at http://fiddle.jshell.net/pimvdb/6C47r/show/:29:1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X