如何确定javascript中引用了哪个函数?

时间:2011-03-14 19:53:40

标签: javascript

我正在研究一些JS,其中函数通过引用传递,并且很难看到有时调用哪个函数。它将通过7-8个函数传递,每个函数都有大量参数,因此追踪它的来源非常耗时。我正在努力改变这一点,但我能够弄清楚看到哪个函数实际被调用的唯一方法就是做这样的事情:

        if (console && console.log && method.toSource) {
            console.log(method.toSource());
        }

这仅适用于FF,但至少我可以搜索被调用函数的来源。还有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

试试这个

var whee = {
    test: function(ab) {
        console.log(ab);
        this.test2('Hello', 'World');
    },

    test2: function(a, b) {
        console.log(a+' '+b);
    }
};

function augment(obj, withFn) {
    var name, fn;
    for (name in obj) {
        fn = obj[name];
        if (typeof fn === 'function') {
            obj[name] = (function(name, fn) {
                var args = arguments;
                return function() {
                    withFn.apply(this, args);
                    fn.apply(this, arguments);
                }
            })(name, fn);
        }
    }
}

augment(whee, function(name, fn) {
    console.log("calling " + name);
});

whee.test('hi');

函数augment将obj作为第一个参数,将函数作为第二个参数。它遍历对象的所有成员,寻找功能。当它找到一个时,它会用一个调用传入函数然后调用原始函数的函数替换它。我偷了这个stackoverflow answer的几乎所有代码。

当你将窗口对象传递给它时似乎不能很好地发挥作用,所以希望你的函数不会在窗口范围内声明。

还有这个answer,他们尝试用自己的函数覆盖Function.prototype.call函数。我无法让它在Firefox中运行,但也许你会有更好的运气。

答案 1 :(得分:1)

安装firefox
安装firebug插件
点击右下方的bug图标
点击脚本标签
点击启用
重新加载页面 点击firebug中右侧面板上的堆栈标签

答案 2 :(得分:1)

你在Firebug中试过console.trace()吗?

答案 3 :(得分:1)

可以通过引用比较函数,所以如果你有一个像Alex Brown的答案那样的字典:

var whee = {
    test: function(ab) {
        console.log(ab);
        this.test2('Hello', 'World');
    },

    test2: function(a, b) {
        console.log(a+' '+b);
    }
};

然后你可以比较你现在匿名的参考文献:

function whichFunc(func, funcDict) {
    for (var funcname in funcDict) {
        if (func == funcDict[funcname]) {
            return funcname;
        }
    }
}

非常简单。