1

我试图了解 jQuery 和 JavaScript 对象和函数,并掌握它是如何this工作的以及它指向的位置。

请有人可以解释为什么有效。

Cat.prototype.meowLater = function() {
    var self = this;
    window.setTimeout(
        function() {
            self.meow();
        }
        , 1000);
}

我感兴趣和困惑的一点是为什么self实际上可以在计时器调用的匿名函数中访问该变量。我认为因为self在另一个函数中声明了它是本地的并且只能由该函数访问。

4

3 回答 3

2

函数从父作用域继承变量(除非被另一个同名且作用域更窄的变量屏蔽)。

由于匿名函数是在self作用域的函数内部定义的,因此它可以访问它。

于 2012-05-19T20:38:55.847 回答
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.meowLaterself可用于setTimeout

另外,
我们在this.meow()这里没有使用,因为this指的是当前对象,因此windowsetTimeout函数中的。

于 2012-05-19T20:43:13.420 回答
1

Javascript 具有嵌套范围,因此另一个函数内部的函数会继承外部函数的所有变量(它仍在范围内)。当您使用异步函数时(setTimeout在这种情况下),变量self将引用作用域 self 变量,它是this(一个 Cat 实例),但this将是 window.self 变量。

希望这会有所帮助,这需要一些时间来适应。

于 2012-05-19T20:43:05.437 回答