将console.log自动添加到每个函数

有没有办法让任何函数输出一个console.log语句时,通过注册一个全局钩子的地方(也就是说,没有修改实际的函数本身)或通过其他方式调用?

以下是用您select的函数来扩充全局名称空间中的所有函数的方法:

function augment(withFn) { var name, fn; for (name in window) { fn = window[name]; if (typeof fn === 'function') { window[name] = (function(name, fn) { var args = arguments; return function() { withFn.apply(this, args); return fn.apply(this, arguments); } })(name, fn); } } } augment(function(name, fn) { console.log("calling " + name); }); 

一个缺点是调用augment之后没有创build函数会有额外的行为。

如果您想要更有针对性的日志logging,下面的代码将logging特定对象的函数调用。 您甚至可以修改对象原型,以便所有新的实例也可以进行日志logging。 我使用Object.getOwnPropertyNames而不是… in,所以它可以和ECMAScript 6类一起使用,它没有枚举方法。

 function inject(obj, beforeFn) { for (let propName of Object.getOwnPropertyNames(obj)) { let prop = obj[propName]; if (Object.prototype.toString.call(prop) === '[object Function]') { obj[propName] = (function(fnName) { return function() { beforeFn.call(this, fnName, arguments); return prop.apply(this, arguments); } })(propName); } } } function logFnCall(name, args) { let s = name + '('; for (let i = 0; i < args.length; i++) { if (i > 0) s += ', '; s += String(args[i]); } s += ')'; console.log(s); } inject(Foo.prototype, logFnCall); 

这里有一些Javascript代替了console.log到Javascript中的每个函数; 在Regex101上玩吧 :

 $re = "/function (.+)\\(.*\\)\\s*\\{/m"; $str = "function example(){}"; $subst = "$& console.log(\"$1()\");"; $result = preg_replace($re, $subst, $str); 

这是一个'快速和肮脏的黑客',但我觉得它是有用的debugging。 如果你有很多function,要小心,因为这会增加很多代码。 此外,正则expression式很简单,可能不适用于更复杂的函数名称/声明。

实际上,您可以将自己的函数附加到console.log中,以加载所有内容。

 console.log = function(msg) { // Add whatever you want here alert(msg); }