eval调用函数,该函数调用定义函数的eval
eval calls function which calls eval which defines function
我知道标题听起来很复杂,但为了保持动态,这是有目的的,请放心;)
示例(注意,假设这些示例代码在外部评估中)
//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之外),我会得到这样的错误:对象不是函数
如果我在外部eval中定义了myfunction,我会得到这样的错误:对象不是函数
//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(){}');}
自最初的问题以来,对以下内容进行了编辑:也许你可以在outer eval中创建一个var,让myfunction将函数定义的地址返回给该var。然而,我希望保留函数名称和定义。
好的,所以我假设你实际上是想控制eval使用的范围。。。
为什么不
eval.call(context, 'function test(){}');
示例
eval.call(window, 'function test(){}');
eval()
确实在本地范围内执行,但这不是问题所在。
首先,抛弃eval()
!
其次,在没有eval()
的情况下,想清楚自己想要什么。更好的是,当你有这个问题时,请更新。
由于我无法理解实际问题,这里有一些猜测:
1。对特定对象的引用
如果你想引用一个特定对象的this
,而当前上下文还不够,那么使用类似这个问题的东西将你的新函数"绑定"(包含在ecma5中)到this
。
当然,你仍然可以参考当地的关闭。
2.具有特定闭包的函数
如果您想调用一个作用域"更远"或不同于"当前作用域"的函数,则在您希望它具有的作用域中定义"该函数"(闭包),然后使用对内部作用域具有的"该函数的引用
例如
var test='outer';
var outer = function (){ alert(test);}
(function(){
var test='inner';
var inner = function(){
alert(outer());
}
inner();
})()
您会注意到inner()
在这个例子中返回"outer"
在第二个示例函数test()
中不存在,因为它还没有定义))
- 推荐在JavaScript中执行存储为字符串的函数,而不是使用eval
- 调用绕过eval()的函数
- eval()读取函数参数有多糟糕
- Eval未声明函数
- 空引用错误 Eval(字符串) 将其传递给代码隐藏中的函数
- 如何在 jQuery 中使用 eval 从不同的文件调用另一个函数
- 使用 eval 从字符串创建函数的不同方法
- 如何在javascript中的eval函数中添加单引号
- eval函数-求值顺序
- Eval()函数在firefox中不起作用
- eval函数在JavaScript中不能正常工作
- Html中的EVAL()函数&JavaScript给出奇怪的结果…
- JS eval()函数只解释变量
- 关于eval()函数的帮助
- JavaScript语法疯狂:指向eval函数的指针不是eval函数
- Imacros Eval函数需要小帮助
- 执行Eval函数会导致内部错误
- JSON Eval函数中的意外标识符
- 为eval函数转义javascript撇号/引号,因此它仍然可以作为选择器使用
- 解码javascript中的eval函数