为什么匿名函数可以从定义的函数中访问变量?

时间:2012-05-19 20:36:06

标签: javascript function object this

我正试图了解jQuery和JavaScript对象和函数,并掌握this的工作原理及其指向的位置。

请有人解释为什么this有效。

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

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

3 个答案:

答案 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);
}

由于setTimeoutCat.prototype.meowLater的内部功能,self可用setTimeout

另外, 我们这里没有使用this.meow(),因为this引用了当前对象,因此引用了window函数中的setTimeout

答案 2 :(得分:1)

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

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