1

只是想知道在调用函数时是否会触发一些代码,而无需将代码添加到函数中,例如:

function doSomething(){
    //Do something
}

//Code to call when doSomething is called
4

4 回答 4

3

您可以包装函数:

(function(){
   var oldFunction = doSomething;
   doSomething = function(){
       // do something else
       oldFunction.apply(this, arguments);
   }
})();

我在这里使用IIFE只是为了避免污染全局命名空间,它是附件。

于 2013-11-04T18:30:51.783 回答
2

嗯,是的,这实际上并不难做到。关键是函数的名称只是一个标识符,就像其他任何标识符一样。如果你愿意,你可以重新定义它。

var oldFn = doSomething;
doSomething = function() {
    // code to run before the old function

    return oldFn.apply(this, arguments);

    // code to run after the old function
};

请注意,最好这样做oldFn.apply(this, arguments)而不是仅仅oldFn. 在许多情况下,这无关紧要,但上下文(即this函数内部的值)和参数可能很重要。Usingapply意味着它们被传递,就像oldFn被直接调用一样。

于 2013-11-04T18:31:12.437 回答
0

怎么样的东西:

function doSomething(){
     doSomething.called = true;
}

//call?
doSomething();

if(doSomething.called) {
   //Code to call when doSomething is called
}
于 2013-11-04T18:32:31.753 回答
0

我知道您说您不想修改原始函数,但考虑添加回调。然后你可以在你的函数中根据不同的结果执行代码(例如 onSucess 和 onError):

function doSomething(onSuccess, onError){
    try {
        throw "this is an error";
        if(onSuccess) {
            onSuccess();
        }
    } catch(err) {
        if(onError) {
            onError(err);
        }
    }
}

然后,当您调用 时doSomething,您可以使用内联函数指定要执行的操作:

doSomething(function() {
    console.log("doSomething() success");
}, function(err) {
    console.log("doSomething() error: " + err);
});
于 2013-11-04T18:37:08.270 回答