2013-06-18 9 views
0

У меня есть хэш, называемый опциями. Проблема, с которой я сталкиваюсь, заключается в том, что 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; 
} 
+0

Какие проблемы у вас с этим кодом? Кажется, это сработало для меня. –

+0

почему опции ['beforeOpen']. Call()? не должны быть опциями ['beforeOpen']()? – Edorka

+0

Почему даже беспокоиться об этом негибкое решение? – schlingel

ответ

2

Проблема заключается в том, что в функции вы определяете для переопределения options['beforeOpen'], вы используете options['beforeOpen'], который к тому времени было переписано!

Вам нужно кэшировать и использовать кэшированное значение в вашей новой функции:

var cachedBeforeOpen = options.beforeOpen; 

if (typeof cachedBeforeOpen == "function") { 
    options.beforeOpen = function() { 
    cachedBeforeOpen.call(); 
    methodThatINeedToDo(); 
    }; 
} else { 
    options.beforeOpen = methodThatINeedToDo; 
} 
0
var oldCall = options['beforeOpen']; 
var newCall = function(){ 
oldCall(); 
methodThatINeedToAddToDo(); 
}; 
options['beforeOpen'] = newCall; 
1

Просто всегда называют methodThatINeedToDo, так как вы хотите, и там проверить, если следует вызвать метод опций:

function methodThatINeedToDo(){ 
    options.beforeOpen && options.beforeOpen(); 
    alert('maintenance'); 
} 
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](); 
    } 
}); 
}); 
+0

Хотя это действительно хорошая точка, у меня нет доступа к той части кода, которая вызывает метод, и в настоящее время она не может обрабатывать множество функций. Мне действительно нравится это решение, хотя, спасибо. –

Смежные вопросы