2013-06-18 140 views
0

我有一個叫做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; 
} 
+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

雖然這是一個非常好的觀點,但我無法訪問調用該方法的代碼部分,但它目前無法處理一組函數。不過,我非常喜歡這個解決方案,謝謝。 –