是的,这是关于将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)
中的范围?
谢谢
答案 0 :(得分:2)
我认为既然将它存储为变量,我可以传递start()方法而不会丢失范围?
不,因为您仍在使用this
的值,因为调用start
时只是间接的。您可以在 Constructor
内执行此操作:
function Constructor() {
// ...other stuff...
var that = this;
this.start = function(){
console.log(that.key)
};
// ...other stuff...
}
(...并删除您在原型上放置的那个)。
现在你可以随心所欲地传递start
; that
将是调用构造函数时的值this
。 start
在对构造函数的调用中对that
变量有持久引用。
当然,成本是通过Constructor
创建的每个实例都有{em>拥有<{1}}函数的副本。大多数现代JavaScript引擎都足够聪明,可以重用函数代码(但是它们需要为每个start
创建单独的函数实例,它只是它们可以重用的幕后实际代码。)
您的其他选择不是在start
或Constructor
内处理此问题,而是在/当您使用start
将start
的副本发送到其他地方时进行处理。 Function#bind
是一个ECMAScript5(ES5)功能,但它可以在较旧的引擎上进行填充。
示例:
Function#bind
更多(在我的博客上):