回调中的内联回调函数?

Mic*_*sis 2 javascript callback

我有一个包含回调的函数,当完成时,我想有选择地将其中继回原始函数调用。

例如:

const UI = {
    update : function(var1) {
        $(var1).animate({ opacity: 0 }, 100, "linear", function() {
                // Callback 1: Do stuff
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是以下内容:

UI.update("whatever", function() {
   // Callback 2: Do more stuff after Callback 1 is complete
});
Run Code Online (Sandbox Code Playgroud)

是否可以像这样内联?

T.J*_*der 5

是的,当然可以-只需为回调声明一个参数,然后update在动画结束时不需要执行任何操作,只需将回调animate直接传递给:

const UI = {
    update : function(var1, callback) {
// -------------------------^
        $(var1).animate({ opacity: 0 }, 100, "linear", callback); // ***
    }
};
Run Code Online (Sandbox Code Playgroud)

如果update需要在调用回调之前做更多工作,只需从回调内部animate调用回调:

const UI = {
    update : function(var1, callback) {
    // ---------------------^
        $(var1).animate({ opacity: 0 }, 100, "linear", function() {
            // ...work `update` does here...
            // Call the callback:
            if (callback) {                                           // ***
                callback(/*...perhaps some arguments here...*/);      // ***
            }                                                         // ***
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

callback直到update返回后才可以调用。该animate回调是一个封闭 ¹ ²在var1callback (更准确地说,在词法环境中,他们中存在),所以他们会保持访问后update返回。

您可能只对上面显示的“真实”检查感到满意。其他时候,人们会更加严格,例如:

if (typeof callback === "function") {
Run Code Online (Sandbox Code Playgroud)

(很多年前,在Web浏览器中,某些主机提供的功能"object"而不是"function"它们提供的功能typeof,但是所有模糊的现代浏览器都确保了"function"现在的功能。)


有关闭包的更多信息:

¹ 在我贫乏的小博客中,关闭并不复杂(一些过时的术语,但是...)

² 关于闭包的规范堆栈溢出问题