尝试使用带有参数的闭包作为回调

trying to use a closure with parameters as a callback

本文关键字:闭包 回调 参数      更新时间:2023-09-26

我有一个从方法调用的库函数。它需要一个参数的回调,我想成为来自同一对象的另一个方法。 我似乎无法正确理解语法。 这是我得到的:

myOriginalObject.login = function() {
    // inside a method
    var obj = this;
    var closure = function(token) { return function() { obj._login2(token); } }
    $window.gapi.auth.authorize({"client_id": this.clientId,
                                 "immediate":false,
                                 "response_type":"token",
                                 "scope":this.scopes}, closure );       
    // .. some more code and method ends
}
myOriginalObject._login2 = function(authResult)
{
  // .. I can't get this function called by the gapi library
}

附言抱歉,如果这篇文章没有正确完成(仍在学习),谢谢!!

您正在将对closure函数的引用传递给authorize,但我认为您想调用它并将引用传递给它创建的函数。所以:

// `token` argument here ------------------v
var closure = function() { return function(token) { obj._login2(token); } }
// not here------------^

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, closure() );
// Call it -----------------------------------------------^^

您可能根本不需要 closure 函数,但如果不了解周围的代码,就很难分辨。但这很可能是你所需要的:

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, function(token) {
                                 obj._login2(token);
                             });

旁注:由于myOriginalObject是单例,因此不需要var obj = this;,您可以直接使用符号myOriginalObject

$window.gapi.auth.authorize({"client_id": this.clientId,
                             "immediate":false,
                             "response_type":"token",
                             "scope":this.scopes}, function(token) {
                                 myOriginalObject._login2(token);
                             });

这一行:

var closure = function(token) { return function() { obj._login2(token); } }

将返回一个函数,即 closure() 的返回值是一个函数。

一个解决方案:

改变

var closure = function(token) { return function() { obj._login2(token); } }

var closure = function(token) { obj._login2(token); }