什么是“;函数(响应){}”;

what is "function(response){}"

本文关键字:响应 函数 什么      更新时间:2023-09-26

当我看到这个页面时,我正在阅读Facebook API,其中有以下片段:

FB.ui({
  method: 'feed',
  link: 'https://developers.facebook.com/docs/',
  caption: 'An example caption',
}, function(response){});

这段代码让我很困惑。如果我的理解是正确的,这是FB.ui的函数调用,它的第一个参数是对象文字。但是它的第二个参数是什么,这个function(response){}是什么?在我看来,这应该是一个语法错误。

这是一个回调。因为JS是在浏览器中运行的,所以它不能简单地坐着等待网络请求完成。当服务器发送响应时,浏览器必须关闭并执行其他工作,因此回调用于在某些远程操作完成后回调代码。

这种特殊的模式,包括:

remoteCall(objectParams, responseCallback)

是处理发送到服务器或文件系统的一些请求的一种非常常见的方法。这是一种将实际IO操作放在单独线程中的方法,这样就不会冻结程序的其余部分。

JS中处理异步操作的主要方法有三种:

回调参数

您可以将这些作为函数参数或对象的一部分传递:

remoteCall(objectParams, responseCallback)
remoteCall({
  success: responseCallback
})

一旦达到某种状态(完成、失败、进度更改),函数就负责调用您提供的函数。

事件

一种更优雅但有点复杂的处理方式是通过适当的事件。内置的XHR类使用以下内容(来自维基百科文章):

var request = new XMLHttpRequest();
request.onreadystatechange = function () {
    var DONE = this.DONE || 4;
    if (this.readyState === DONE){
        alert(this.readyState);
    }
};

在这个模型中,您订阅了一个命名事件,该事件将在将来的某个时间被调用。

DOM(承载脚本的网页)通常使用标准化名称通过事件与脚本交互。MDN有一个DOM事件的页面,它们使用什么信息,以及它们何时被解雇。

承诺(/延期)

这是一个结合了回调和事件的较新模型。jQuery以使用promise的残缺版本而闻名,但对于真正的promise,请求可以变成:

promise.then(function(result) {
  console.log(result); // "Stuff worked!"
}, function(err) {
  console.log(err); // Error: "It broke"
});

这篇文章(上面的片段来自这里)对事件和承诺进行了极好的比较。

promise最好的实现之一是Bluebird,它有关于模式及其工作方式的精彩文档。

你所看到的

匿名函数(声明为内联,没有名称)用于将函数作为对象传递(因为JS中的函数是对象)。如果函数名为:

function foo() { ... }
// do some things
foo(); // do foo

那么您就可以在同一范围内调用它。如果函数未命名:

var foo = function() { ... }
// do some things
foo(); // do foo

然后你需要一个引用来调用它。这个名称不是发布给任何人使用的。

这是立即调用函数的基础,当加载脚本时,函数可以用来执行一些逻辑:

(function () {
    ...
}());

该函数在加载时调用自己一次,但没有名称(并且没有分配给变量),从而防止再次调用。