【问题标题】:Code to be executed each time a function is called每次调用函数时要执行的代码
【发布时间】:2011-09-21 04:18:29
【问题描述】:

我编写了一个包含大量函数和函数调用的程序。我希望能够在每个函数调用之前调用代码。例如,每次调用函数时,都有控制台日志

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

我想一劳永逸地写这个,而不是遍历每个函数声明。我想这在本质上类似于 CSS pseudo elements :before:after,但适用于 JavaScript 中的函数调用。

【问题讨论】:

  • 这只是为了调试还是你有更深层次的目的?
  • 我想在每次函数调用时注入 1ms 的暂停,以使 DOM 重绘顺利进行。
  • Javascript 没有睡眠功能可以让你轻松做到这一点;不是每个函数都“需要”改变(只有重绘的),最后,这听起来太老套了——有更多标准的方法来解决这个问题之王。
  • 同意@missingno;这听起来像是一个相当糟糕的主意。您可以使 DOM 重绘“更顺畅”,但这很可能会通过为每个函数调用增加 1 毫秒的开销来使 JS 执行停止。
  • 据我所知,console.log() 不会将浏览器线程从执行 Javascript 中解放出来。相反,您应该在关键位置使用 setTimeout() 以获得所需的效果,但绝对不是在每个函数的开头。

标签: javascript


【解决方案1】:

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

【讨论】:

  • 即使有办法做到这一点,我怀疑它会比适当的调试器更好。
  • 同意。 AFAIK没有办法
  • 一旦你学会使用它,Firebug 就是一个合适的调试器。
  • @nightcracker;哈哈,我说的是 OP 的 hack。
【解决方案2】:

【讨论】:

    【解决方案3】:

    您可以通过扩展 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 值。

    演示: http://jsfiddle.net/3kuad/

    【讨论】:

      【解决方案4】:

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

      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.
      

      【讨论】:

      • 我最初发布的内容有很多错误。以上确实有效!
      【解决方案5】:

      我以前从未见过有人这样做,所以我认为这是不可能的。

      我做了一个快速的谷歌搜索,没有任何有用的东西回来。只是继承,但我看不出这有什么特别的帮助。

      看起来 bdesham 打败了我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多