在传递回调时绑定变量

时间:2018-04-28 00:22:05

标签: javascript binding callback

在将回调函数传递给调用者时,如何将回调(或传递值)绑定到回调?

例如:

function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(){
            console.log("Iteration number ", i); 
        }.bind(i), i*1000);
    }
}

callbackTest();

结果:

$ node callback-with-bind.js
Iteration number  3
Iteration number  3
Iteration number  3

我希望绑定在回调传递给调用者时发生。但没有。

我该怎么做?

在我的实际应用程序中,调用者将另一个参数传递给我的回调,因此我不能简单地将i作为参数传递。

function callbackTest() {
    for(i=0; i<3; i++){
        setTimeout(function(myParam){
            console.log("Iteration number ", i);
        }.bind(i), i*1000);
    }
}

callbackTest();

1 个答案:

答案 0 :(得分:2)

bind,当提供单个参数时,设置函数this - 在您的示例中,函数内的i根本没有被绑定或更改 - 它仍然只使用(全局)i。您应该使用bind 第二个参数,该参数指定函数的第一个参数,并为您的函数提供适当的第一个参数,以便可以使用它:

&#13;
&#13;
function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(internalI){
            console.log("Iteration number ", internalI); 
        }.bind(null, i), i*1000);
    }
}

callbackTest();
&#13;
&#13;
&#13;

可以根本不使用任何参数并继续使用bind(i),但是你必须在你的函数中用i替换this,通常不是this应该引用的那种东西:

&#13;
&#13;
function callbackTest() {
    for(i=0; i<3; i++){
       setTimeout(function(){
            console.log("Iteration number " + this); 
        }.bind(i), i*1000);
    }
}

callbackTest();
&#13;
&#13;
&#13;

或者,您可以使用i声明letfunction callbackTest() { for (let i = 0; i < 3; i++) { setTimeout(function() { console.log("Iteration number ", i); }, i * 1000); } } callbackTest();具有块范围,而不是全局范围或函数范围:

&#13;
&#13;
mCallbackManager = CallbackManager.Factory.create();
            btnSignInFacebook = (LoginButton) findViewById(R.id.login_button_fb);
            btnSignInFacebook.setReadPermissions("email", "public_profile");
            btnSignInFacebook.getLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
&#13;
&#13;
&#13;