在将函数引用到变量时等于此的Javascript

时间:2013-12-16 18:22:49

标签: javascript oop this

是的,这是关于将this存储在变量(that)中的另一个问题,但我对此感到困惑:

function Constructor(){
    this.key = 'my key'
};


Constructor.prototype.start = function(){
    var that = this;
    return (function (){
        console.log(that.key)
    }());

};

foo = new Constructor;
foo.start()

bar = new Constructor;
newFoo = bar.start
newFoo()

我认为,因为this存储为变量,我可以绕过start()方法而不会丢失范围? 我知道这已经经常讨论过,但我找不到符合这种特殊情况的答案。

如何在不使用newFoo()的情况下取回Constructor.apply(this)中的范围?

谢谢

1 个答案:

答案 0 :(得分:2)

  

我认为既然将它存储为变量,我可以传递start()方法而不会丢失范围?

不,因为您仍在使用this的值,因为调用start时只是间接的。您可以 Constructor内执行此操作:

function Constructor() {
    // ...other stuff...

    var that = this;
    this.start = function(){
         console.log(that.key)
    };

    // ...other stuff...
}

(...并删除您在原型上放置的那个)。

现在你可以随心所欲地传递start; that将是调用构造函数时的值thisstart在对构造函数的调用中对that变量有持久引用

当然,成本是通过Constructor创建的每个实例都有{em>拥有<{1}}函数的副本。大多数现代JavaScript引擎都足够聪明,可以重用函数代码(但是它们需要为每个start创建单独的函数实例,它只是它们可以重用的幕后实际代码。)

您的其他选择不是在startConstructor内处理此问题,而是在/当您使用startstart的副本发送到其他地方时进行处理。 Function#bind是一个ECMAScript5(ES5)功能,但它可以在较旧的引擎上进行填充。

示例:

Function#bind

更多(在我的博客上)