2017-05-07 6 views

答えて

1

最善の解決策は、次のようになります:

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

インサイド_Yes - (だから、推論の私の誤差がある

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

デバッグここでは、コードのクロム、Firefoxとエッジでテストあなたがアクセスすることができます。

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

そして、いやが、バインドは、それが機能を結合し、新しい機能を作成しません...

+0

いいえ、バインド()新しい関数を作成します。https://developer.mozillaを。 org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bindにあります。そして最後の 'alert(yes.iStep);は、関数オブジェクト' yes'(コールバックとして送信された)が別の関数オブジェクトであることを証明します。 'yes'がコールバックとして提供されたときに' _Yes = YES'が呼び出されるのはなぜですか? はい、私はあなたのソリジションで動いていました: '_Yes.bind({" rCallback ":rCallback、" iStep ":iStep})' - この例の奇妙な動作を理解したいと思います。 –

+0

@bornloser "description"セクションを読んでください...? –

+0

まあ私は意味がわからない_ **説明:** bind()関数は新しい束縛関数(BF)を作成します。 BFは元の関数オブジェクトをラップするエキゾチック関数オブジェクト(ECMAScript 2015の用語)です。 BFを呼び出すと、一般にラップされた関数が実行されます。 - /私の例は、2つの異なる関数optjects 'yes'と' YES'を明確に示しています。 'yes'がコールバックとして与えられますが' YES'が呼び出されます。私はこれが奇妙だと思う。 –

関連する問題