eval调用函数调用定义函数的eval

时间:2013-12-06 21:42:48

标签: javascript scope eval

我知道这个标题听起来很复杂,但为了让事情保持活力,这个目的是为了放心;)

示例(请注意,假设这些示例代码位于外部eval中)

//Ex1 this works
eval('function test (){}');
test();

//Ex2 this doesn't work (myfunction definition is written below)
myfunction();
test(); //I get an error

如果我全局定义myfunction(在外部eval之外),我会收到此错误:object不是函数

如果我在外部eval中定义了myfunction,我会收到此错误:object不是函数

//myfunction definition
function myfunction () {eval('function test (){}');}

问题是:如何将函数定义的范围扩展到其定义的函数之外?我知道如何制作一个eval全局(请参阅下面的替代myfunction),但这看起来有点矫枉过正,我只想将范围扩大到外部eval就是全部。这可能吗?

更新: 这些示例只定义了一个保持简单的函数,但是我希望扩展它以便myfunction定义许多函数,并且它定义的函数取决于其他因素是动态的。我还希望保留函数名称和定义。如果除了全局进行eval调用之外我找不到解决方案,我可能最终只将myfunction的内容放入外部eval中,然后我必须将内容复制到使用它的每个地方。

//making eval global works, but I had hoped to just upscope to the calling eval
function myfunction(){var globaleval=eval;globaleval('function test(){}');}

自最初提问以来,已经编辑过: 也许你可以在外部eval中创建一个var,让myfunction将函数定义的地址返回给var。但是,我希望保留函数名称和定义。

3 个答案:

答案 0 :(得分:2)

好的,所以我假设你实际上是指你想要控制eval使用的范围......

为什么不

eval.call(context, 'function test(){}');

示例

eval.call(window, 'function test(){}');

答案 1 :(得分:1)

eval()确实在本地范围内执行,但这不是您的问题。

首先,沟渠eval()

其次,在没有eval()的情况下清楚地思考你想要什么。更好的是,请在有问题时更新问题。

由于我无法理解这里的实际问题是一些猜测:

1.引用特定对象

如果您想要引用特定对象的this且当前上下文不够,那么请使用类似this question的内容来“绑定”(包含在ecma 5中)您的新函数{ {1}}。

当然,您仍然会参考本地关闭。

2。具有特定闭包的函数

如果要调用范围“远远超出”或不同于“当前范围”的函数,则在您希望它具有的范围内定义“该函数”(闭包)但是然后使用对内部范围具有的“那个函数”的引用

e.g。

this

您会注意到var test='outer'; var outer = function (){ alert(test);} (function(){ var test='inner'; var inner = function(){ alert(outer()); } inner(); })() 在此示例中返回“outer”

答案 2 :(得分:-1)

在你的第二个例子中,函数test()不存在,因为它尚未定义)))