2011-09-20 87 views
1

我已经编写了一个包含很多函数和函数调用的程序。我希望能够在每个函数调用之前调用代码。例如,每次调用某个函数时,都要有控制台日志每次调用一个函数都要执行的代码

console.log("A function has been called!"); 

我想一劳永逸地写这个,而不是经过每个函数声明。我想这与CSS pseudo elements:before:after的精神类似,但应用于JavaScript中的函数调用。

+1

这只是用于调试或者你有一些更深层次的目的是什么? – hugomg

+0

我想在每个函数调用中注入1ms暂停以允许DOM重绘顺利进行。 – Randomblue

+1

Javascript没有睡眠功能,可以让您轻松做到这一点;不是每个*函数都会“需要”改变(只有重绘的函数),最后,这听起来太疯狂了 - 还有更多的标准方法可以解决这个问题。 – hugomg

回答

3

我不认为有任何内置的方式来做这样的事情。为什么不使用像Firebug这样的JavaScript调试器,并在您认为可能给您带来麻烦的功能上设置断点?

+0

即使有办法做到这一点,我怀疑它会比propper调试器更好。 – hugomg

+0

同意。 AFAIK没有办法 – Marshall

+0

一旦你学习了它,Firebug是一个适当的调试器。 – orlp

0

我从来没有见过任何人这样做过,所以我假设这是不可能的。

我做了一个快速的谷歌搜索,没有什么有用的回来。只是继承,但我不明白这特别有用。

看起来像bdesham打我吧!

1

我不知道如何自动注入控制台喷涌为每个函数。但是如果你想明确哪些函数将日志记录到控制台,你可能会使用闭包。

function ConsoleLogWrap(obj, funcname, msg) { 
    var xmsg = msg; 
    var xfuncname = funcname; 
    var xobj = obj; 

    obj[funcname+"$"] = obj[funcname]; 
    obj[funcname] = function() { 

     try { 
      console.log(xmsg); 
     } catch(e) { 
     } 

     xobj[xfuncname+"$"](arguments); 

    }; 

} 


function Addition(x, y) { 
    return x + y; 
} 

ConsoleLogWrap(window, "Addition", "Addition was called"); 

window.Addition(5,5); // this will spew out "Addition was called" and return the result of 5+5. 
+0

我曾经发布过的东西有很多的错误。上面的工作! – selbie

1

您可以通过扩展Function.prototype方法添加到您创建的所有功能。

为了使功能异步运行,你似乎在您的评论来表示,您可以添加这样的功能:

Function.prototype.makeAsync = function() { 
    var func = this; 
    var args = arguments; 
    setTimeout(function() { 
     func.call.apply(func, args); 
    }, 1); 
}; 

...然后调用它像这样:

function my_func(a, b, c) { 
    console.log(this); 
    console.log(a, b, c); 
} 

my_func.makeAsync(element, 1, 2, 3); 

请注意,您传递给makeAsync的第一个参数将成为您调用的函数的this值。

DEMO:http://jsfiddle.net/3kuad/

相关问题