为什么在关闭中捕获“this”?

时间:2012-11-13 08:22:53

标签: javascript

如果我创建一个变量,比如_this,并将其分配给它,它将被捕获为闭包而不是对当前版本的引用。为什么呢?

示例代码:

var AnimCore = (function () {
    function AnimCore(ctx) {
        this.ctx = ctx;
    }
    AnimCore.prototype.beginAnimation = function () {
        this.animLoop();
    };
    AnimCore.prototype.animLoop = function () {
        var _this = this;
        this.ctx.drawSomething(); // removed actual drawing code, this is a proxy for it.
        window.setTimeout(function () {
            _this.animLoop();
        }, 1000 / 60);
    };
    return AnimCore;
})();

在这种情况下,每次调用函数时,_这都绑定到初始值,而不是新的。为什么呢?

[更新] 我现在明白闭包发生在匿名函数中,这就是为什么_这总是指同一件事。然而,下一个问题是为什么this.ctx每次都有效?如果我不使用匿名函数,它会在第一次失败后失败。

1 个答案:

答案 0 :(得分:1)

this是一个特殊变量。这很特殊,因为它的上下文是在你用this调用函数时确定的。

但是,如果您将this分配给变量,则在闭包内:

var myFunc = (function () {
    var staticThis = this;
    return function () {
        staticThis.doStuff();
    };
}).call(myObj);

看看我做了什么? 我有一个名为staticThis的变量,我明确将其设置为等于myObj
staticThis保留this (恰好是指向特定对象的指针),而不是保持"魔法& #34;动态上下文解析this,为this关键字保存。