2017-05-07 7 views
0

bind()는 원래 함수의 복사본을 반환해야합니다. 그러나이 복사본을 콜백으로 전달하면 원래 함수가 호출됩니다. . - (크롬, 파이어 폭스와 가장자리 테스트 어디 추론에 내 오류가Javascript : 이벤트가 제출되지 않았습니다. bind (..) - 콜백 복사본 :/

<html><body> 
<script>  
// new api to wrap these nested Cordova callbacks .. 
ScanDir = function (sPath, rCallback, iStep){ 
    yes = _Yes.bind(rCallback); // should return a copy/newInstance of _Yes !?! 
    yes.iStep = iStep; 

    // simulate a cordova callback .. 
    document.getElementById("test").addEventListener("click", yes); 
} 

_Yes = function YES(o){ 
    // this is not the new instance returned by bind(..): 
    alert(_Yes.iStep); // = undefined 
    alert(YES.iStep); // = undefined 
    alert(arguments.callee.iStep); // = undefined 

    alert(yes.iStep); // wrong, 'yes' must not be global... 
} 
</script> 
<span id="test">click here to trigger callback</span> 
<script> 
    // code that uses my new api.. 
    function Go(v){ 
     if (!v.iStep) return ScanDir(v,Go,1); 
     alert("continue with switch("+v.iStep+")"); 
    } 

    Go("Music/"); 
</script> 
</body></html> 

디버그 여기에 코드 : http://www.robosoft.de/forums/bug.htm

답변

1

가장 좋은 해결책은 다음과 같습니다

yes = _Yes.bind({callback:rCallback,iStep:iStep}); 

내부 _Yes를? HTTPS : //developer.mozilla

+0

아니, 바인드() 새로운 함수를 만듭니다 ... 그것은 기능을 결합,

this.callback(); alert(this.iStep); 

그리고 아니, 바인드는 새로운 함수를 생성하지 않습니다 당신은에 액세스 할 수 있습니다. org/ko/docs/웹/JavaScript/Reference/Global_Objects/Function/bind. 그리고 이미 마지막'alert (yes.iStep);는 함수 객체'yes' (콜백으로 제출)가 다른 함수 객체라는 것을 증명합니다. 'yes '가 콜백으로 제공되었을 때'_Yes = YES'가 호출되는 이유는 무엇입니까 ??? 네, 솔직히 말씀 드렸습니다.'_Yes.bind ({ "rCallback": rCallback, "iStep": iStep})'- 아직도 주어진 예제의 이상한 행동을 이해하고 싶습니다. –

+0

@bornloser "설명"섹션을 읽었습니까? –

+0

글쎄, 나는 의미를 알지 못한다. ** ** 설명 : ** bind() 함수는 새로운 바운드 함수 (BF)를 만든다. BF는 원본 함수 개체를 래핑하는 이국적인 함수 개체 (ECMAScript 2015의 용어)입니다. BF를 호출하면 일반적으로 랩핑 된 함수가 실행됩니다. _/내 예제는 두 개의 별개 함수 optjects 인'yes'와'YES'를 명확하게 증명합니다. 'yes'가 콜백으로 주어 지지만'YES'가 호출됩니다. 나는 이것이 이상하다고 생각한다. –