AngularJs服务功能 - 这()

时间:2016-01-03 12:32:22

标签: javascript angularjs angular-services

我正在学习angularjs,我一直注意到一个函数被声明,大多数人通常会做出#34;这个"在修改它之前进入var。那是为什么?

以下代码段:

function NameService() {

     var self = this; **THIS BLOCK. WHY??**

    //getName returns a promise which when 
    //fulfilled returns the name.
    self.getName = function() {
      return $http.get('/api/my/name');
    };
}

在底部,该示例使用self.getName。为什么不直接调用this.getName?

由于

2 个答案:

答案 0 :(得分:0)

这只是您可以使用的模式。通常它有助于避免'this'关键字的冲突,这在javascript'world'中非常常见。

还有助于提高可读性,因此您可以更轻松地阅读代码。 查看此示例,您可以在其中轻松区分服务的公共功能和本地/私有功能:

function NameService() {

    var self = this; **THIS BLOCK. WHY??**

    self.getName = getName;
    self.setName = setName;


    //getName returns a promise which when 
    //fulfilled returns the name.
    function getName() {
        return $http.get('/api/my/name');
    };

    function setName(){
       //blablabla
    }

    function justAHelperFunction(){
        //helper function, kind of inner function, a private function
    }
}

答案 1 :(得分:0)

在javascript this中引用当前对象和this的值,比如说方法取决于函数的调用方式。当您将回调传递给函数调用时,this的上下文会发生更改,并且回调定义this内部不会引用具有进一步调用带回调函数的方法的对象。

var person = {
  firstName: 'John',
  lastName: 'Doe',

  printFullName: function () {
    setTimeout(function () {
      // here this doesn't point to the person object anymore
      // as the callback passed to setTimeout was invoked by global window object
      // so this points to window
      console.log(this.firstName + ' ' + this.lastName);
    }, 100)
  }
}

要修复上述场景,您希望这是一个人,您可以在另一个变量中创建捕获引用的上下文的别名。这是上述方法的正确版本。

printFullName: function () {
    var self = this;
    // till now self == this
    setTimeout(function () {
      // here self still points to person whereas this is now pointing to window
      console.log(self.firstName + ' ' + self.lastName);
    }, 100)
  }