2013-06-18 10 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

이것은 정말 좋은 지적이지만, 메서드를 호출하는 코드의 일부에 액세스 할 수 없으며 현재 함수 배열을 처리 할 수 ​​없습니다. 그래도이 솔루션을 정말 좋아해. 고마워. –