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);