2017-05-07 3 views
0

bind() doit renvoyer une copie de la fonction d'origine .. Cependant, lorsque vous passez cette copie en rappel, la fonction d'origine est appelée: . - (testé avec Chrome, Firefox et Edge Alors, où est mon erreur dans le raisonnementJavascript: l'événement n'appelle pas bind (..) - copie du rappel: -/

<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> 

debug le code ici: http://www.robosoft.de/forums/bug.htm

Répondre

1

la meilleure solution serait:

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

_oui intérieur? vous pouvez accéder à:

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

Et non, bind ne crée pas une nouvelle fonction, il lie la fonction ...

+0

Non, bind() crée une nouvelle fonction: https: //developer.mozilla. org/fr/docs/Web/JavaScript/Référence/Global_Objects/Fonction/bind. Et déjà le dernier 'alert (yes.iStep);' prouve que l'objet de fonction 'yes' (soumis comme callback) est un objet fonction différent. Pourquoi '_Yes = YES' est-il appelé quand' yes' a été fourni comme callback ??? Et oui, j'avais allredy déplacé avec votre soludion: '_Yes.bind ({" rCallback ": rCallback," iStep ": iStep})' - Encore je voudrais comprendre ce comportement étrange de l'exemple donné. –

+0

@bornloser et avez-vous lu la section "description" ...? –

+0

Eh bien, je ne comprends pas la signification de _ ** Description: ** La fonction bind() crée une nouvelle fonction liée (BF). Un BF est un objet fonction exotique (un terme d'ECMAScript 2015) qui enveloppe l'objet fonction d'origine. L'appel d'un BF aboutit généralement à l'exécution de sa fonction enveloppée._: -/Mon exemple prouve clairement deux optjects de fonction distincts 'yes' et' YES'. 'yes' est donné comme callback mais' YES' est appelé. Je pense que c'est bizarre. –