我正在学习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?
由于
答案 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)
}