Getting scope of function caller

被刻印的时光 ゝ 提交于 2019-12-30 08:53:11

问题


I have a function that breaks somewhere in Line 1433 of 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);
    };
};

Is there any way to see what line a function is executed from, from within itself?

(since it's a third party lib, and I cant really do

var me =this;

and log me)


回答1:


There is arguments.callee.caller, which refers to the function that called the function in which you access that property. arguments.callee is the function itself.

There is no way to get the scope of the original function without passing it. In the following example, you cannot determine the this value inside foo (apart from knowing there is nothing special happening with this here):

function foo() {
    bar();
}

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

foo();

Documentation


To get the line number things becomes trickier, but you can throw an error and look at the stack trace: http://jsfiddle.net/pimvdb/6C47r/.

function foo() {
    bar();
}

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

foo();

For the fiddle, it logs something similar to the following in Chrome, where the end of the line says the line number and character position:

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


来源:https://stackoverflow.com/questions/7444399/getting-scope-of-function-caller

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!