Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法用一个函数包装所有JavaScript方法?_Javascript_Logging_Function_Aop_Word Wrap - Fatal编程技术网

有没有办法用一个函数包装所有JavaScript方法?

有没有办法用一个函数包装所有JavaScript方法?,javascript,logging,function,aop,word-wrap,Javascript,Logging,Function,Aop,Word Wrap,我想用一些日志代码包装每个函数调用。产生输出的东西,如: func1(param1, param2) func2(param1) func3() func4(param1, param2) 理想情况下,我希望API的形式如下: function globalBefore(func); function globalAfter(func); 我在谷歌上搜索了很多,但是似乎只有面向方面的解决方案需要你包装你想要记录的特定函数,或者其他什么。我想要适用于全局范围内的每个函数的东西(显然,除了它本身

我想用一些日志代码包装每个函数调用。产生输出的东西,如:

func1(param1, param2)
func2(param1)
func3()
func4(param1, param2)
理想情况下,我希望API的形式如下:

function globalBefore(func);
function globalAfter(func);

我在谷歌上搜索了很多,但是似乎只有面向方面的解决方案需要你包装你想要记录的特定函数,或者其他什么。我想要适用于全局范围内的每个函数的东西(显然,除了它本身)。

也许您可以有一个函数,将函数作为参数传递给它执行:

function runner(func_to_run) {
    alert('about to run ' + func_to_run.name);

    func_to_run();

}

function test() {
    alert ('in test');
}

runner(test)

可能会成功吗?

一个简单的方法是这样的

var functionPool = {} // create a variable to hold the original versions of the functions

for( var func in window ) // scan all items in window scope
{
  if (typeof(window[func]) === 'function') // if item is a function
  {
    functionPool[func] = window[func]; // store the original to our global pool
    (function(){ // create an closure to maintain function name
         var functionName = func;
         window[functionName] = function(){ // overwrite the function with our own version
         var args = [].splice.call(arguments,0); // convert arguments to array
         // do the logging before callling the method
         console.log('logging: ' + functionName + '('+args.join(',')+')');
         // call the original method but in the window scope, and return the results
         return functionPool[functionName].apply(window, args );
         // additional logging could take place here if we stored the return value ..
        }
      })();
  }
}
要撤消,您需要运行

for (func in functionPool)
  window[func] = functionPool[func];
注释

这只处理全局函数,但您可以轻松地将其扩展以处理特定对象或方法等。

您希望包装对内置函数(如
window.alert
)的调用,还是仅处理用户定义的函数?理想情况下,所有函数都可以。我可以在以后写一些东西来搜索、排序和过滤。很好,这已经足够让我开始了。谢谢如果将全局作用域函数定义为
function myFunction(){…}
var myFunction=function(){…}
,这在IE8或以下版本中不起作用(但在IE9测试版中起作用!),因为它们不会被枚举。要在IE8或更低版本中使用,您需要将函数定义为
this.myFunction=function(){…}
window.myFunction=function(){…}
@gilly,感谢您的提醒。我没有意识到这一点,很高兴知道。。