Javascript:返回在eval中创建的值

Javascript:返回在eval中创建的值,javascript,node.js,callback,eval,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)'); 这可能吗?是的: function end(){ console.log(this); } eval('var a = 0, self = this; setTimeout(function(

我想这样做:

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

是的:

function end(){ console.log(this); }
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)');
请注意,我将变量
self
设置为
this
,然后在调用
end
时使用,这允许我们在调用期间为
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促进:


因为您使用的是NodeJS,所以您使用的是V8,它具有
函数#bind
。(如果在浏览器中执行此操作,如果需要支持较旧的浏览器,则必须小心为
bind
提供垫片。)

@Adam,将
end()
更改为
end.call({“a”:a})
。这就是你想要的吗?我之所以想使用
eval
是因为javascript存储在一个文件中,我必须对它进行评估。有没有办法只获取eval中创建的变量?使用
this
,我也将从node.js中的全局变量获取所有对象。请检查我的进一步问题,这是从这个问题演变而来的@Adam:“有没有办法只获取在eval中创建的变量?通过这个,我也从全局变量中获取所有对象”这表明在您调用上述代码的上下文中,
这个
指的是全局对象。您无法获得在
eval
中创建的
var
变量列表,但如果您可以控制该文件的内容,则可以让它定义任何要导出为您提供的对象上的道具的内容。但是您可以考虑将外部文件改装成一个适当的模块,包括通过<代码>要求< /代码>,而不是通过<代码> EVA运行它。
function end(){ console.log(this); }
var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000);
function end(){ console.log(this); }
var a = 0, boundEnd = end.bind(this); setTimeout(function(){ a = 10; boundEnd(); }, 2000);