首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自动为每个函数添加console.log

自动为每个函数添加console.log
EN

Stack Overflow用户
提问于 2011-02-18 03:51:42
回答 5查看 45.2K关注 0票数 106

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-18 05:06:28

下面是用您选择的函数扩充全局名称空间中所有函数的方法:

代码语言:javascript
复制
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之后创建的任何函数都不会有额外的行为。

票数 68
EN

Stack Overflow用户

发布于 2019-08-13 03:47:09

对我来说,这看起来是最优雅的解决方案:

代码语言:javascript
复制
(function() {
    var call = Function.prototype.call;
    Function.prototype.call = function() {
        console.log(this, arguments); // Here you can do whatever actions you want
        return call.apply(this, arguments);
    };
}());
票数 18
EN

Stack Overflow用户

发布于 2016-07-26 13:10:54

如果需要更有针对性的日志记录,下面的代码将记录特定对象的函数调用。您甚至可以修改对象原型,以便所有新实例也都获得日志记录。我使用Object.getOwnPropertyNames而不是for...in,因此它适用于ECMAScript 6类,这些类没有可枚举的方法。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5033836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档