Javascript中的回调真的是方法调用吗?如果是这样,它们如何“级联”?

时间:2015-11-21 11:46:08

标签: javascript angularjs function callback

例如,从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示例中没有发生这种情况。那么这里发生了什么?

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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

  

所以$ routeProvider是一个对象,它似乎是.when(回调)

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

  

.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
  )
);




答案 1 :(得分:0)

.when的{​​{1}}方法正在返回$routeProvider以允许链接。每次调用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方法返回新的承诺。缺乏这种理解一直是许多图书馆开发人员的愚蠢行为。