Javascript中的回调真的是方法调用吗?如果是的话,他们是怎么回事'级联'

Are callbacks in Javascript really methods calls? If so how are they 'cascaded'?

本文关键字:他们是 级联 怎么回事 真的 回调 方法 调用 Javascript 如果      更新时间:2023-09-26

例如,以Angular.js:中的代码为例

app.config(function ($routeProvider) {
   $routeProvider
       .when('/', {
           templateUrl: 'page/hello.html',
           controller: 'mainCount'
       })
       .when('/pag', {
           templateUrl: 'page/hello.html',
           controller: 'secondCount'
       })
});

所以$routeProvider是一个对象,而.when(回调)似乎是一个函数调用。如果是这样的话,上面的这两个方法调用是如何"一个在另一个之上"被调用的?

通常情况下,我预计会发生这种情况:

object.method().method()

第二个方法调用第一个方法返回的对象。显然,在上面的Angular示例中没有发生这种情况。这是怎么回事?

Javascript中的回调真的是方法调用吗?

也许吧。作为一个方法与作为一个回调是正交的。

方法调用是指调用附加到对象的函数。

回调是作为参数传递给另一个函数调用的函数。

接受回调的函数可能会将其附加到对象上,并在该上下文中调用它,但这不是必需的。

所以$routeProvider是一个对象,它看起来像.当(回调)

when在此实例中不是回调。promise有一个名为when的方法,它接受回调作为参数,但这里没有处理promise,也没有向when传递函数。

.当(回调)是函数调用时。

是的。when的返回值是一个对象。该对象与调用第一个when的对象相同,并且它仍然具有一个名为when的属性,该属性的值是一个函数。

这是方法链接而不是回调。

这是怎么回事?

只是合理的返回值。看看这个简单的例子:

function Incrementor() {
  this.value = 0;
}
Incrementor.prototype.up = function() {
  this.value++;
  return this;
}
var i = new Incrementor();
document.body.appendChild(
  document.createTextNode(
    i.up().up().up().value
  )
);

$routeProvider.when方法正在返回其this以允许链接。对.when的每次调用都会添加到存储的路由列表中。

$routeProvider = function $routeProvider() {
  this.routeList = [];
};
$routeProvider.prototype.when = function when(string,object) {
  this.routeList.push(string, object);
  return this;
};

类似地,对于$q承诺,.then方法为$q服务提供一个稍后调用的函数,$q服务将该函数存储在其列表或"队列"中,但在这种情况下,它返回一个新的承诺。对.then方法的每个连续调用都返回一个新的promise。

这是非常重要的一点。承诺不会返回自己的变异版本。他们用.then方法返回新的承诺。缺乏这种理解一直是许多库开发人员的愚蠢行为。