我正试图了解jQuery和JavaScript对象和函数,并掌握this
的工作原理及其指向的位置。
请有人解释为什么this有效。
Cat.prototype.meowLater = function() {
var self = this;
window.setTimeout(
function() {
self.meow();
}
, 1000);
}
我感兴趣和困惑的是为什么变量self
实际上可以在定时器调用的匿名函数中访问。我认为这是因为self
在另一个函数中被声明它是本地的并且只能被该函数访问。
答案 0 :(得分:2)
函数从父作用域继承变量(除非被另一个具有相同名称和较窄作用域的变量掩盖)。
由于匿名函数是在self
作用域的函数内定义的,因此它可以访问它。
答案 1 :(得分:2)
内部函数可以使用外部函数可用的变量。
下面,
Cat.prototype.meowLater = function() {
// I create the variable self that refers to the this (the current object)
var self = this;
// I create a timeout that calls the self.meow function within an anonymous function
/*** NOTE : You don’t always have to create an anonymous function it’s just that in
this case, it is required ***/
window.setTimeout(
function() {
self.meow();
}
, 1000);
}
由于setTimeout
是Cat.prototype.meowLater
的内部功能,self
可用setTimeout
。
另外,
我们这里没有使用this.meow()
,因为this
引用了当前对象,因此引用了window
函数中的setTimeout
。
答案 2 :(得分:1)
Javascript具有嵌套作用域,因此另一个函数内部的函数继承外部函数的所有变量(它仍然在作用域中)。当您使用异步函数(在这种情况下为setTimeout
)时,变量self
将引用作用域自变量,即this
(Cat实例),但this
将是窗口。
希望这有所帮助,这需要一些时间来适应。