【问题标题】:eval calls function which calls eval which defines functioneval 调用函数,该函数调用定义函数的 eval
【发布时间】:2013-12-07 11:37:24
【问题描述】:

我知道标题听起来令人费解,但为了保持动态,这是有目的的;)

示例(请注意,这些示例代码假定在外部 eval 中)

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

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

如果我在全局范围内(外部 eval 之外)定义了 myfunction,则会收到此错误:对象不是函数

如果我在外部 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(){}');}

自最初的问题以来已对以下内容进行了编辑: 也许您可以在外部 eval 中创建一个 var,让 myfunction 将函数定义的地址返回给该 var。但是,我希望保留函数名称和定义。

【问题讨论】:

  • 这...很痛...
  • 尽管eval 存在明显的问题,但我想知道如果您定义一个名为bla 的函数,test() 不起作用,您会感到惊讶。除了范围界定问题。
  • 只有我一个人不明白你想要达到的目标吗?
  • 关于指向函数的指针是什么意思?是的,内部有指针,有时在谈论 Javascript 的某些方面时使用该词是有道理的,但不是你如何/在哪里使用它。顺便说一句,你甚至错了——如果你使用变量来分配函数表达式而不是使用函数声明,那么你可以在分配函数之前很好地定义变量。然后你就会有你的“函数指针”(它会在最终分配后指向一个函数)。

标签: javascript scope eval


【解决方案1】:

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

为什么不

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

例子

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

【讨论】:

  • 感谢您的回答,是否可以识别调用该函数的 eval 的上下文?
  • @user3015682 这对我来说毫无意义,但是您可能希望使用this 关键字作为您的上下文
  • 谢谢,传递关键字 this 有效: myfunction(this) 然后定义函数 myfunction(context) {eval.call(context,'function test(){}');工作,并且似乎完全像我想做的那样(我假设这指的是外部 eval 上下文。)
  • 很高兴您已将所有内容整理好。快乐编码!
  • 奇怪的是,如果我传入一个乱码字符串代替关键字 this 它仍然有效。也许 eval.call 只是让它对字符串全局化?关键字 this 是一个对象而不是字符串。
【解决方案2】:

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

首先,抛弃eval()

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

由于我无法理解实际问题,因此这里有一些猜测:

1. 对特定对象的引用

如果您想要引用特定对象的this 并且当前上下文不足够然后使用this question 之类的东西将您的新函数“绑定”(包含在 ecma 5 中)到this

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

2。具有特定闭包的函数

如果你想调用一个作用域“更远”或不同于你的“当前作用域”的函数,那么在你希望它拥有的作用域中定义“那个函数”(闭包)但是然后使用对内部范围具有的“那个函数”的引用

例如

var test='outer';
var outer = function (){   alert(test);}

(function(){
    var test='inner';
    var inner = function(){
        alert(outer());
    }
    inner();
})()

您会注意到,inner() 在此示例中返回“外部”

【讨论】:

  • 那不是标题,它是句子的一部分。
  • @gillyspy 感谢您提供有关使用关键字 this 的提示!这是我需要的一块拼图!
  • 酷,别忘了投票选出对你有帮助的答案。在 this 是“相对的”并且可以被操纵的 javascript 中非常有用。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多