如何判断在javascript中引用哪个函数?

问题描述:

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

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

在这只作品FF,但至少可以搜索被调用函数的来源。有没有更好的办法?

+0

为什么你必须知道哪个函数被传递?由于参数?对我来说,你应该改变你的设计。一方面灵活,但不得不知道你正在处理的具体事例似乎并不合适。你能详细说明一下上下文吗?还是只是为了调试? – 2011-03-14 19:58:19

+1

对我来说,如果我做了'console.log(myFunction)',然后点击控制台中的输出,它就会直接跳转到Script选项卡中的函数。 – nickf 2011-03-14 19:59:02

+0

@felix下面是一个例子。从项目列表中选择某个项目时出现问题。我需要找到该项目被选中时调用的函数,并查看那里发生了什么。它看起来像onclick()。 Obv我可以找出该方法的设置,但有时需要很长时间,因为它本身可能是一个传递的函数。代码量很大,所以我需要一种快速自动的方式来查找它,而不是手动查看。 – Shawn 2011-03-14 20:06:03

尝试此

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

功能扩充需要一个物镜作为第一个参数,并作为第二功能。它循环遍历寻找函数的对象的所有成员。当它找到一个时,它用一个调用传入函数的函数替换它,然后调用原始函数。我偷走了这个* answer几乎所有的代码。

当您将窗口对象传递给窗口对象时,它看起来好像不太好,所以希望您的函数不是在窗口范围内声明的。

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

+0

这只有在他已经有了一些关于它可能是哪个功能的想法时才有效。 – 2011-03-14 20:01:58

+0

这个应用程序有15000行的js ... – Shawn 2011-03-14 20:03:00

+0

它看起来像萤火虫有一个通话记录选项卡。我从来没有使用它,但它可能适合你。 http://getfirebug.com/javascript – 2011-03-14 20:18:59

在右下角
点击脚本选项卡上的错误图标安装Firefox
安装的Firebug插件
点击
单击启用
重新加载页面
点击右侧面板上的堆栈选项卡上的萤火

您是否在Firebug中尝试过console.trace()

功能可参照进行比较,所以如果你有一本字典像亚历克斯·布朗的回答是:

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

很简单。