在另一个匿名函数中嵌入匿名函数

时间:2013-06-18 15:44:11

标签: javascript

我有一个名为options的哈希。我面临的问题是options['beforeOpen']可能已经是一个函数,在这种情况下我不想覆盖它。我想改为调用它,然后调用另一个需要每次调用的函数

在此示例中,每次需要调用的方法是methodThatINeedToDo。我认为下面的代码可以实现这一点,但它没有像我预期的那样工作。

function methodThatINeedToDo(){alert('maintenance');}

var options = {beforeOpen: function(){alert('first');}} 
if(typeof options['beforeOpen'] == "function"){
    options['beforeOpen'] = function(){options['beforeOpen'].call(); methodThatINeedToAddToDo();}
} else {
    options['beforeOpen'] = methodThatINeedToDo;
}

4 个答案:

答案 0 :(得分:2)

问题在于 你要定义的功能是否覆盖options['beforeOpen'],你正在使用options['beforeOpen'],到那时候已被覆盖了!

您需要缓存它并使用新函数中的缓存值:

var cachedBeforeOpen = options.beforeOpen;

if (typeof cachedBeforeOpen == "function") {
  options.beforeOpen = function() {
    cachedBeforeOpen.call();
    methodThatINeedToDo();
  };
} else {
  options.beforeOpen = methodThatINeedToDo;
}

答案 1 :(得分:1)

只需始终致电methodThatINeedToDo,因为您想要并在那里查看是否应该调用您的选项方法:

function methodThatINeedToDo(){
  options.beforeOpen && options.beforeOpen();
  alert('maintenance');
}

答案 2 :(得分:1)

真的闻起来像错误的解决方案。为什么不Publish/Subscribe pattern

以下是一个小例子:http://jsfiddle.net/ajyQH/

$(function() {

var yourObj = { yourFct : [] };


$('#btn').click(function() {
    yourObj.yourFct.push(function() {
        $('#testibert').append($('<p>').text('hallo'));
    });
});

$('#btn_exec').click(function() {
    var len = yourObj.yourFct.length;
    for(var i = 0; i < len; i++) {
      yourObj.yourFct[i]();
    }
});
});

答案 3 :(得分:0)

var oldCall = options['beforeOpen'];
var newCall = function(){
 oldCall(); 
 methodThatINeedToAddToDo();
};
options['beforeOpen'] = newCall;