Получение области действия вызывающей стороны - PullRequest
6 голосов
/ 16 сентября 2011

У меня есть функция, которая прерывается где-то в строке 1433 ExtJS.

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);
    };
};

Есть ли способ узнать, из какой строки выполняется функция, изнутри себя?

(поскольку это сторонняя библиотека, и я не могу сделать

var me =this;

и лог me)

1 Ответ

11 голосов
/ 16 сентября 2011

Существует arguments.callee.caller, который относится к функции, вызвавшей функцию, в которой вы получаете доступ к этому свойству. arguments.callee - это сама функция.

Невозможно получить область действия исходной функции без ее передачи. В следующем примере вы не можете определить значение this внутри foo (не считая того, что с this здесь ничего особенного не происходит):

function foo() {
    bar();
}

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

foo();

Документация


Чтобы получить номер строки, все становится сложнее, но вы можете выдать ошибку и посмотреть трассировку стека: http://jsfiddle.net/pimvdb/6C47r/.

function foo() {
    bar();
}

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

foo();

Для скрипки записывается нечто похожее на следующее в Chrome, где в конце строки указывается номер строки и положение символа:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...