在将回调函数传递给调用者时,如何将回调(或传递值)绑定到回调?
例如:
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();
答案 0 :(得分:2)
bind
,当提供单个参数时,设置函数this
- 在您的示例中,函数内的i
根本没有被绑定或更改 - 它仍然只使用(全局)i
。您应该使用bind
第二个参数,该参数指定函数的第一个参数,并为您的函数提供适当的第一个参数,以便可以使用它:
function callbackTest() {
for(i=0; i<3; i++){
setTimeout(function(internalI){
console.log("Iteration number ", internalI);
}.bind(null, i), i*1000);
}
}
callbackTest();
&#13;
你可以根本不使用任何参数并继续使用bind(i)
,但是你必须在你的函数中用i
替换this
,通常不是this
应该引用的那种东西:
function callbackTest() {
for(i=0; i<3; i++){
setTimeout(function(){
console.log("Iteration number " + this);
}.bind(i), i*1000);
}
}
callbackTest();
&#13;
或者,您可以使用i
声明let
,function callbackTest() {
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log("Iteration number ", i);
}, i * 1000);
}
}
callbackTest();
具有块范围,而不是全局范围或函数范围:
mCallbackManager = CallbackManager.Factory.create();
btnSignInFacebook = (LoginButton) findViewById(R.id.login_button_fb);
btnSignInFacebook.setReadPermissions("email", "public_profile");
btnSignInFacebook.getLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
&#13;