我有一个函数及其内容作为字符串.
var funcStr = "function() { alert('hello'); }";
Run Code Online (Sandbox Code Playgroud)
现在,我做一个eval()来实际在变量中获取该函数.
var func = eval(funcStr);
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,在Chrome和Opera中,只需拨打电话即可
func();
Run Code Online (Sandbox Code Playgroud)
调用该函数并显示警报.
但是,在其他浏览器中并非如此.没啥事儿.
我不想争论哪种方法是正确的,但我怎么能这样做呢?我希望能够调用variable(); 执行存储在该变量中的函数.
如何从代码隐藏中调用Eval()?我知道这是像DataBinder.Eval(Container.DataItem,"name")之类的东西的前端快捷方式,但我无法编译这个该死的东西.我想,我错过了正确的方法参数.我想转这样的事情:
<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# Eval("name") %>'/>
Run Code Online (Sandbox Code Playgroud)
成:
<asp:Image ID="imgLogo" runat="server" ImageUrl='<%# GetImagePath(???) %>'/>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:
protected string GetImagePath(????)
{
//some code
return "some/logical/path" + Eval("name");
}
Run Code Online (Sandbox Code Playgroud)
asp:Image控件位于一个绑定到SqlDataReader的转发器中.
我正在异步构建包含javascripts的东西,这是有效的,但是我正在寻求改进错误检测(所以所有的错误似乎都不是来自AJAX调用附近的一些线路,它们将它们拉下来.
如果我使用eval来评估多行javascript文件,有没有办法跟踪哪一行发生错误?
通过在包含时保持对我需要的变量的引用,我没有问题确定错误发生在哪个文件中.我的问题是确定错误发生在哪一行.
例:
try {
eval("var valid_statement = 7; \n invalid_statement())))");
} catch(e) {
var err = new Error();
err.message = 'Error in Evald Script: ' + e.message;
err.lineNumber = ???
throw err;
}
Run Code Online (Sandbox Code Playgroud)
如何判断错误发生在第二行?具体来说,我有兴趣在Firefox中这样做.
我知道错误对象e.stack在Mozilla浏览器中有,但输出似乎没有正确考虑换行.
我尝试了这个简单的JavaScript代码:
eval('{"Topics":["toto","tata","titi"]}')
Run Code Online (Sandbox Code Playgroud)
例如,在Chrome控制台中,会返回
SyntaxError:意外的令牌:
我在JSONLint上尝试了JSON ,它是有效的.
你看到了这个bug吗?
我需要在函数foo()触发时触发函数bar().我无法控制函数foo或将来是否会改变.我经常有这种情况(我讨厌它).
我写了这个函数来将我的代码添加到函数foo的末尾:
function appendToFunction(fn,code){
if(typeof fn == 'function'){
var fnCode = fn.toString() ;
fnCode = fnCode.replace(/\}$/,code+"\n}") ;
window.eval(fnCode); // Global scope
return true ;
}
else{
return false ;
}
}
Run Code Online (Sandbox Code Playgroud)
例如:
appendToFunction(foo,"bar();");
Run Code Online (Sandbox Code Playgroud)
这对我来说是一个可怕的想法 - 但它确实有效.有人可以指出我更好(更安全)的方向.
编辑:foo不是一个特定的功能,但我最终处理的许多功能.它们不会在页面中动态更改.但它们可能会不时地改变(例如,形式验证要求).
解决方案:我选择了Adam的答案的修改版本.它并不完美,但它比我的更好:
var oldFoo = foo ;
foo = function(){
var result = oldFoo.apply(this, arguments);
bar();
return result ;
}
Run Code Online (Sandbox Code Playgroud)
NB.注意IE6/7中没有.apply()方法的一些本机函数.
在我的代码中,我eval用来评估用户给出的字符串表达式.有没有办法编译或以其他方式加快这种说法?
import math
import random
result_count = 100000
expression = "math.sin(v['x']) * v['y']"
variable = dict()
variable['x'] = [random.random() for _ in xrange(result_count)]
variable['y'] = [random.random() for _ in xrange(result_count)]
# optimize anything below this line
result = [0] * result_count
print 'Evaluating %d instances of the given expression:' % result_count
print expression
v = dict()
for index in xrange(result_count):
for name in variable.keys():
v[name] = variable[name][index]
result[index] = eval(expression) # <-- option ONE
#result[index] = math.sin(v['x']) * …Run Code Online (Sandbox Code Playgroud) 我无法理解Python中"eval()"和"exec"的语义.(此问题中的所有代码在Python 2.7.8和Python 3.4.2中的行为方式相同)."eval" 的文档说:
如果省略[locals和globals],则表达式在调用eval()的环境中执行.
"exec"有类似的语言.我显然不理解这句话,因为我希望以下程序定义的四个函数做同样的事情.
def h(x):
ls = locals()
exec('def i(y): return (w, x, y)', globals(), ls)
i = ls['i']
def j(y): return (w, x, y)
k = eval('lambda y: (w, x, y)')
l = lambda y: (w, x, y)
return i, j, k, l
w = 1
i, j, k, l = h(2)
Run Code Online (Sandbox Code Playgroud)
他们不.
>>> i(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in i
NameError: name …Run Code Online (Sandbox Code Playgroud) 我必须将项目从 Java 8 迁移到 Java 17。
我可以解决大多数问题,但它包含一个方法,在该方法中我使用 ScriptEngineManager 来评估数学术语。
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine e = mgr.getEngineByName("JavaScript");
String t = "5*7";
if (isMathTerm(t)) {
System.out.println(e.eval(t).toString());
}
Run Code Online (Sandbox Code Playgroud)
在 Java 8 中它按要求工作,但在 Java 17 中e始终为 null。
据谷歌称,Java 17 不再支持 JavaScript 引擎。
由于项目限制,我不允许使用第三方库。
Java 17 中有没有正确的方法来处理这个问题?
我有一些看起来像这样的字符串:
"(8, 12.25), (13, 15), (16.75, 18.5)"
Run Code Online (Sandbox Code Playgroud)
我想将它们中的每一个转换为python数据结构.优选地,包含一对浮点值的元组的列表(或元组).
我可以做到这一点eval("(8, 12.25), (13, 15), (16.75, 18.5)"),给我一个元组元组,但我不认为天真评估外部信息将是一个明智的决定.
所以我想知道优雅的pythonic解决方案是什么样的.
有没有人使用现有的node.js REPL为自己设置这样的东西?我没想到要快速做到这一点.
我今天这样做的方式是使用emacs和这个:https: //github.com/ivan4th/swank-js
该模块由以下部分组成:
一个SLIME-js插件到emacs,结合js2-mode,让你只需在函数def的主体中的某个地方发出一个CMx,然后关闭函数的字符串到...
用Node.js编写的Swank-js服务器(是的,您可以从本地计算机直接评估到远程进程) - 它接收您评估的函数的字符串并实际上将其删除
整个部分允许您使用浏览器连接到该服务器上的另一个端口,然后让您在该浏览器上操作DOM(这非常了不起但不相关)
我的解决方案在emacs端使用SLIME-js我需要('swank-js')在我的app.js文件上
现在..我有几个关于我的解决方案或其他可能的问题和问题:
Q1:这有点过头了吗?有人有秘密的方式来评估从纳米到他的实时过程的东西吗?
Q2:我不得不改变swank-js评估的方式..它使用了某种黑魔法:
var Script = process.binding('evals').Script;
var evalcx = Script.runInContext;
....
this.context = Script.createContext();
for (var i in global) this.context[i] = global[i];
this.context.module = module;
this.context.require = require;
...
r = evalcx("CODECODE", this.context, "repl");
Run Code Online (Sandbox Code Playgroud)
据我所知,只是将全局变量复制到新的上下文中,并且在eval上,不会更改原始函数定义 - SOOO ..我只是使用简单的"eval"和IT WORKS.
你对此有何评论?
问题3:为了重新评估函数,它需要是一个GLOBAL函数 - 将所有函数定义都设置为全局(类似clojure)是不好的做法?你认为还有另一种方法吗?
eval ×10
javascript ×4
python ×3
.net ×1
asp.net ×1
commonjs ×1
data-binding ×1
java ×1
java-17 ×1
json ×1
node.js ×1
python-2.7 ×1
python-3.4 ×1
scriptengine ×1
string ×1
swank ×1
tuples ×1