Javascript 为什么匿名函数可以从其定义的函数中访问变量?
我试图了解jQuery和JavaScript对象和函数,并了解它是如何工作的,以及它指向哪里 请有人解释一下为什么有效Javascript 为什么匿名函数可以从其定义的函数中访问变量?,javascript,function,object,this,Javascript,Function,Object,This,我试图了解jQuery和JavaScript对象和函数,并了解它是如何工作的,以及它指向哪里 请有人解释一下为什么有效 我感兴趣和困惑的是,为什么变量self实际上可以在计时器调用的匿名函数中访问。我认为,因为在另一个函数中声明了self,所以它将是本地的,并且只能被该函数访问。一个函数从父范围继承变量(除非被另一个具有相同名称和较窄范围的变量屏蔽) 由于匿名函数是在作用域为self的函数中定义的,因此它可以访问它。函数从父作用域继承变量(除非被另一个同名且作用域较窄的变量屏蔽) 由于匿名函数是
我感兴趣和困惑的是,为什么变量
self
实际上可以在计时器调用的匿名函数中访问。我认为,因为在另一个函数中声明了self
,所以它将是本地的,并且只能被该函数访问。一个函数从父范围继承变量(除非被另一个具有相同名称和较窄范围的变量屏蔽)
由于匿名函数是在作用域为
self
的函数中定义的,因此它可以访问它。函数从父作用域继承变量(除非被另一个同名且作用域较窄的变量屏蔽)
由于匿名函数是在
self
作用域的函数内定义的,因此它可以访问它。Javascript具有嵌套作用域,因此另一个函数内的函数继承外部函数的所有变量(它仍在作用域内)。当您使用异步函数时(setTimeout
在本例中),变量self
将引用作用域自变量,即this
(Cat实例),但this
将在窗口中显示
希望这会有所帮助,这需要一些时间来适应。Javascript具有嵌套的作用域,因此另一个函数中的函数继承外部函数中的所有变量(它仍然在作用域中)。当您使用异步函数时(
setTimeout
在本例中),变量self
将引用作用域自变量,即this
(Cat实例),但this
将在窗口中显示
希望这会有所帮助,这需要一些时间来适应
内部函数可以使用外部函数可用的变量
这里,
因为,setTimeout
是Cat.prototype.meowLater
的内部功能,self
可用于setTimeout
而且,
我们在这里不使用
this.meow()
,因为this
引用当前对象,因此在setTimeout
函数中指向window
内部函数可以使用外部函数可用的变量
这里,
因为,setTimeout
是Cat.prototype.meowLater
的内部功能,self
可用于setTimeout
而且,
我们在这里不使用
this.meow()
,因为this
引用当前对象,因此指向setTimeout
函数中的窗口?Self是一个局部变量,但是timer函数调用也是局部的,在mewlater方法中。我以前从未真正使用过匿名函数,这就是为什么我有点困惑的原因。这是否意味着任何匿名函数都可以访问加载它的函数中设置的所有变量(以及任何全局变量)?这可能是重复的,为什么不起作用?Self是一个局部变量,但是timer函数调用也是局部的,在mewlater方法中。我以前从未真正使用过匿名函数,这就是为什么我有点困惑的原因。这是否意味着任何匿名函数都可以访问加载它的函数中设置的所有变量(以及任何全局变量)?感谢的可能重复。现在一切都变得更有意义了!为什么必须将setTimeout
附加到某个对象上,它实现了什么?setTimeout
在固定时间后调用函数。在本例中,self.meow()将在1000微秒后调用code>。如果这对你有帮助的话,请记下答案:)我理解这一点。我的问题是setTimeout(…)
和window.setTimeout(…)
之间有什么区别吗?为什么setTimeout
必须与某个东西“链接”(我不确定技术术语是什么)是一样的,这只确保调用setTimeout()函数,而不是与此函数同名的其他函数。setTimeout()代码>是窗口
对象的函数。所以,window.setTimeout()代码>。这是正确的方法。但是,由于window
对象在环境中可用,所以不需要添加window
。这是可选的。谢谢。现在一切都变得更有意义了!为什么必须将setTimeout
附加到某个对象上,它实现了什么?setTimeout
在固定时间后调用函数。在本例中,self.meow()将在1000微秒后调用code>。如果这对你有帮助的话,请记下答案:)我理解这一点。我的问题是setTimeout(…)
和window.setTimeout(…)
之间有什么区别吗?为什么setTimeout
必须与某个东西“链接”(我不确定技术术语是什么)是一样的,这只确保调用setTimeout()函数,而不是与此函数同名的其他函数。setTimeout()代码>是窗口
对象的函数。所以,window.setTimeout()代码>。这是正确的方法。但是,由于window
对象在环境中可用,所以不需要添加window
。它是可选的。
Cat.prototype.meowLater = function() {
var self = this;
window.setTimeout(
function() {
self.meow();
}
, 1000);
}
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);
}