2014-02-06 5 views
1

아래와 같은 함수를 호출하고 있습니다. 여기에서는 특정 폼이 그 전에 제출되지 않은 후에 만 ​​호출되어야하는 콜백 함수도 전달합니다.매개 변수로 콜백 함수 전달하기

<div onClick="myNamespace.openDialog(par1,par2,myNamespace.callback(myNamespace.cb,'p1','p2'))">OPEN DIALOG</div> 

var myNamespace = myNamespace || {}; 
myNamespace={ 
    return{ 
     cb:function(p1,p2){alert(p1+" cb "+p2);}, 
     callback:function(f){f(arguments[1],arguments[2]);}, 
     openDialog:function(p1,p2,f){ 
      // aboutBizzNs.cb should be called here only after form submit 

     } 
    } 
}(); 

문제는 alert(p1+" cb "+p2);OPEN DIALOG 클릭 직후라고합니다. 그것은 그렇게해서는 안됩니다. 내가 원할 때만 호출해야합니다. 문제점은 무엇입니까

답변

0

문제는 aboutBizzNs.callback이 즉시 인수로 제공된 함수을 호출한다는 것입니다.

callback: function(f){ 
    // The f variable is bound in a closure below, which is returned immediately. 
    // However, the f function is NOT invoked yet. 
    // We also copy the arguments of this function invocation and expose 
    // them via a variable which is also bound in the following closure. 
    var boundArgs = Array.prototype.slice(arguments, 0); 
    return function() { 
     // Now f is invoked when this inner function is evaluated, which 
     // should be in response to the event. 
     return f(boundArgs[1], boundArgs[2]);} 
    } 
} 

가 나는 또한 apply을 사용하는 것으로 다음과 같은에 비해 :


만들고이 iself를 호출 할 때 제공되는 함수를 호출하는 closure (function)을 반환하는 다음과 비교 매개 변수가 사용될 수있다 "결합"의 임의의 수 ..

return function() { 
    return f.apply(this, boundArgs.slice(1)); 
} 

.. 하지만 티 s는 상당히 일반적인 작업이며 이미 Function.prototype.bind (다른 브라우저에서는 ES5 및 shim-able의 일부 임)에 의해 지원됩니다. .. 원래 같은

myNamespace.callback(myNamespace.cb,'p1','p2') 

은 ..로 기록 될 수있다 ..

myNamespace.cb.bind(this,'p1','p2') 

.. 여기 동일한 효과. 차이점은 bindthis의 "통과"를 허용하지 않기 때문에 콜백 (cb) 내의 this 기능이 다를 수 있습니다. 단지 모든 특수 기능에 대해 잊지 단순히 같은 콜백을 포장

또는 ..

function() { myNamespace.cb('p1','p2') } 
+0

은 인수 및 세부 사항을 거쳐 나는 발견'기능을 전달() {myNamespace.cb ('P1이 ','p2 ')}''openDialog (....., f)'에 대한 인수로서 openDialog() 내부에서'f()'를 호출하면 충분했다. 고마워. – manish

+0

@Manish You' 다시 오신 것을 환영합니다! 클로저 (및 일류 가치로 기능)는 마스터하기에 약간 까다 롭지 만 일단 마스터하면 JavaScript의 마스터가됩니다. – user2864740

관련 문제