即时迭代和更改javascript函数

时间:2010-07-22 08:01:27

标签: javascript

我希望能够遍历文档中的所有JavaScript函数,例如,向它们添加alert('ok');

所以,如果我有:

function a(num) {
  return num;
}

运行我的javascript代码并调用此函数后,它实际上会执行:

{
  alert('ok');
  return num;
}

我知道我可以使用window。[funcName]访问一个函数,但是如何通过所有函数进行迭代并编辑它们?

感谢

PS:我知道这不是一个好主意,但它仅适用于调试环境

2 个答案:

答案 0 :(得分:1)

for (var i in window) {
  if (typeof window[i] == 'function') console.log(i); // logs the function name
}

这会为您提供一系列功能。您无法在JavaScript中修改函数,只能包装它们。这意味着您复制了该函数并用包装器替换原始函数。说,我们有这个功能:

function a(num) { return num;}

然后我们将它包装成这样:

functionName = 'a'; // original function name
window['_original_' + functionName] = window[functionName]; // putting it in a safe place
window[functionName] = function() { // creating wrapper
   alert('ok'); //logger function
   return window['_original_' + functionName].apply(null, arguments); //invoke original
}

这只为您提供全局空间功能,例如它不会记录jQuery插件。如果要记录所有函数,请使用Firebug的分析器。

答案 1 :(得分:0)

我尝试使用包装现有函数的拦截器函数,而不是修改现有函数的代码。只是快速实施(我们可以进一步改进)

function intercept(object, methodBindName, interceptor) {
    var oldMethod = object[methodBindName];
    object[methodBindName] = function() {
        interceptor.apply(null, arguments);
        return oldMethod.apply(object, arguments);
    }
}

function test1(msg) {alert(msg);}
function test2() {alert('hi');}

var methodNames = ['test1', 'test2'];

for(var i = 0; i < methodNames.length; i++) {
    intercept(window, methodNames[i], function(){alert('Hello');})
}
test1('foo');
test2();