我想做这样的事情:
function end(){ console.log(this); } // <-- the problem is here with `this`
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)');
2秒后输出:
{ "a" : 10 }
这有可能吗?
答案 0 :(得分:3)
是:
function end(){ console.log(this); }
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)');
请注意,我将变量self
设置为this
,然后在调用end
时使用Function#call
,这样我们就可以为{设置特定值{1}}在通话过程中。这是有效的,因为传递给this
的匿名函数引用了创建它的执行上下文以及其中的所有变量,因此可以访问setTimeout
(和self
)。
如果使用a
没有非常好的理由(我在这里看不到),我就不会这样做这样:
eval
您还可以创建第二个函数,该函数在调用时转身并使用正确的function end(){ console.log(this); }
var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000);
值调用end
。这称为绑定,由ES5 Function#bind
function促进:
this
由于您使用的是NodeJS,因此您使用的是具有function end(){ console.log(this); }
var a = 0, boundEnd = end.bind(this); setTimeout(function(){ a = 10; boundEnd(); }, 2000);
的V8。 (如果您是在浏览器中执行此操作,则在需要支持旧版浏览器时,必须小心为Function#bind
提供填充程序。)