2016-01-03 49 views
0

我正在学习angularjs,我一直注意到什么时候声明了一个函数,大多数人通常在修改它之前将“this”变成一个var。这是为什么?AngularJs服务功能 - 这()

代码下面片段:

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?

谢谢

+1

这是一种保持正确'this'值并避免混淆的方法。假设你想从一个AJAX调用的成功函数中运行一个方法,你会使用'self'而不是'this',因为这并不意味着你的意思 –

+0

谢谢。这对于这些回复的速度来说非常有意义并且令人印象深刻:) –

回答

0

这只是一个你可以使用的模式。通常它有助于避免在JavaScript'世界'中非常常见的'this'关键字的冲突。

也有助于提高可读性,以便您更轻松地阅读代码。 看看这个例子中,在那里你可以很容易区分服务的公共职能和本地/私有的:与

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 
    } 
} 
+0

谢谢!!!现在,我看到的代码示例的其余部分更有意义。我花了一个小时试图弄清楚自己的大脑。 –

+0

我很高兴能帮你解决这个问题;) – Iamisti

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) 
    }