1

是否可以在每次运行特定函数时执行某些操作,而不知道该函数的名称之外的任何知识?

这将类似于bind

var clicked = 0;
$('#foo').bind('click',function(){
    clicked += 1;
    alert(clicked);
});

所以在那里,每次点击带有 IDfoo的东西时,它都会给变量加 1,clicked这样我就知道它被点击了多少次。如果语法正确,我想做的将等同于以下内容:

var fired = 0;
$('my_function').bind('run',function(){
        fired += 1;
        alert(fired);
});

我不在乎在任何给定的情况下,您是否总是能够弄清楚该功能并使用它,我不想要解决方法,这就是我想要的答案:

每次运行特定函数时,我如何执行某些操作,只需给出函数的名称。如果那不可能,为什么不呢?

4

5 回答 5

2

尝试这样的事情:

var temp = my_function, fired = 0;
my_function = function() {
    fired++;
    temp.apply(this,arguments);
}
于 2013-06-19T22:52:32.567 回答
1

我认为这样的事情可能是你能来的最接近的:

function adjustFunctionToCount(f){
    var count = 0;
    function newF(){
        count++;
        f.apply(this, arguments);
    }
    newF.getCount = function(){ return count; };
    return newF;
}

所以如果你有

function handler(val){
    console.log('called with val ' + val);
}

你可以做

handler = adjustFunctionToCount(handler);
handler('a');
handler('b');
console.log(handler.getCount());

小提琴

不用说你可以内联创建你的函数

var handler = adjustFunctionToCount(function(val){ console.log('called with val ' + val); });

handler('a');
handler('b');
console.log(handler.getCount());

更新的小提琴

于 2013-06-19T22:58:41.180 回答
0

尝试这个:

var count = (function(){
  var c = 0;
  return function(){
    alert(c++);
  };
})();
$('#foo').click(count);

或者

$('#foo').bind('click', count);

当传递匿名函数或表示函数的变量时,它是同一回事。您可以编写自己的代码来执行这样的函数:

function executeFun(func){
  return func();
}
executeFun(count)
executeFun(function(){
  /*everything happens in here. The Anonymous Function will be called
    automatically because of the parameter next to the variable func above */
})

尽管该示例不切实际,但它向您展示了内部发生的情况。另外,我用闭包解决了你潜在的全局范围变量问题。有关闭包的更多信息,请访问https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

于 2013-06-19T23:20:32.190 回答
0

我很确定在一般情况下这是不可能的。

请记住,函数实际上是对象,函数的名称只是一个变量。函数可以在没有分配给命名变量的情况下存在,变量可以超出您的范围,或者重新分配/交换。无论如何,我知道没有任何 API 可以让您挂接到 JS 函数调用。

这可能很有趣:我可以拦截直接调用的函数吗?

于 2013-06-19T22:53:30.843 回答
0

这就是事件驱动编程的用武之地——而 jQuery 让它变得非常容易。

var myFunction = function() {
 //...
 //...
 //...
 $(document).trigger('someEvent');

}


$(document).on('someEvent',function() {
 //the function you would like to run every time myFunction is called
});
于 2013-06-19T23:03:36.627 回答