什么是“功能(响应){}”

时间:2015-10-27 15:10:31

标签: javascript callback

当我遇到this page时,我正在阅读Facebook API,其中有这个片段:

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

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

1 个答案:

答案 0 :(得分:4)

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

这种特殊模式:

remoteCall(objectParams, responseCallback)

是一种处理服务器或文件系统的一些请求的常用方法。这是一种将实际的IO操作放在一个单独的线程中的方法,以免冻结程序的其余部分。

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

回调参数

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

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

该函数负责在您达到某种状态(已完成,失败,进度已更改)时调用您提供的函数。

活动

更优雅,但更复杂的处理方法是通过适当的事件。内置的XHR类使用这些(来自the wikipedia article):

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

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

DOM(托管脚本的网页)通常使用标准化名称通过事件与脚本交互。 MDN的页面为the DOM events,他们使用了哪些信息以及何时被解雇。

无极(/递延)

这是一个结合了回调和事件的新模型。 jQuery以使用mutilated version of promises而闻名,但有了真正的承诺,请求可以成为:

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

This article(上面的代码段来自)对事件和承诺进行了精彩的比较。

承诺的最佳实现之一是Bluebird,它对模式及其工作方式有fantastic documentation

你在看什么

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

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

然后你就可以在同一范围内调用它。如果函数未命名:

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

然后你需要一个引用才能调用它。该名称不会发布给任何人使用。

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

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

此函数在加载时调用自身一次,但没有名称(并且未分配给变量),从而阻止再次调用它。