2017-05-07 30 views
0

bind()應該返回原始函數的副本。但是,當將此副本作爲回調傳遞時,將調用原始函數: - (使用Chrome,Firefox和邊緣測試,因此這裏是我的推理錯誤Javascript:事件不是調用提交的綁定(..) - 回調的副本: -/

<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?您可以訪問:

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

不,綁定不會創建一個新的功能,其綁定的功能...

+0

號,綁定()創建了一個新功能:HTTPS://developer.mozilla。 org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/bind。並且已經是最後一個'alert(yes.iStep);''證明函數對象'yes'(作爲回調提交)是一個不同的函數對象。 爲什麼在提供'yes'作爲回調時調用'_Yes = YES'? 是的,我已allredy與你的soludion繼續前進:'_Yes.bind({「rCallback」:rCallback,「iStep」:iStep}) - 仍然我想理解給出的例子的奇怪行爲。 –

+0

@bornloser並且您閱讀了「說明」部分...? –

+0

嗯,我沒有得到_ **的含義說明:** bind()函數創建一個新的綁定函數(BF)。 BF是一個外來函數對象(來自ECMAScript 2015的一個術語),它包裝了原始函數對象。調用BF通常會導致執行其包裝的函數._: - /我的示例清楚地證明了兩個不同的函數optjects:yes和yes。回叫給出了「是」,但是調用了「是」。我認爲這很奇怪。 –