Javascript:返回在eval中创建的值

时间:2013-04-01 17:07:40

标签: javascript node.js callback eval

我想做这样的事情:

function end(){ console.log(this); } // <-- the problem is here with `this`
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)');

2秒后输出:

{ "a" : 10 }

这有可能吗?

1 个答案:

答案 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提供填充程序。)