使用eval的Javascript函数赋值
我无法重新分配功能。我想为先前定义的函数,使用eval的Javascript函数赋值,javascript,eval,lvalue,Javascript,Eval,Lvalue,我无法重新分配功能。我想为先前定义的函数,drawsecene分配一个不同的方法 function fSwap(funcName, code) { eval(funcName) = eval(code); } fSwap("drawScene", "function drawScene() { /* Do something */ }"); 我觉得这样应该行得通,但由于某种原因,eval(funcName)不是左值,它返回错误ReferenceError:invalid assignm
drawsecene
分配一个不同的方法
function fSwap(funcName, code) {
eval(funcName) = eval(code);
}
fSwap("drawScene", "function drawScene() { /* Do something */ }");
我觉得这样应该行得通,但由于某种原因,eval(funcName)
不是左值,它返回错误ReferenceError:invalid assignment left-side
。更令人费解的是:
var a = function test() {return 0;};
alert(a === eval("a"));
eval("a") = function test() {return 1;};
发出带有true
的警报,但不允许我将其分配给函数a
我唯一的猜测是,出于安全原因,eval()不返回左值。如果是这样,我如何实现fSwap(),使其接受两个字符串并将代码分配给给定的函数名?您应该改用回调函数。您可以这样做:
function fSwap(funcName, callback) {
window[funcName] = callback;
}
fSwap("drawScene", function drawScene() { /* Do something */ });
要直接回答您的问题,问题在于您正在为一段经过评估的代码赋值。那不行。工作将是:
function fSwap(funcName, code) {
eval(funcName+' = '+code);
}
但请不要这样做。另一种方法是使用回调函数,更简洁。几乎总是最好不要使用
eval
,只要不是绝对需要使用它。(根据,显然必须使用字符串,所以一定要使用这段代码)。您应该使用回调函数。您可以这样做:
function fSwap(funcName, callback) {
window[funcName] = callback;
}
fSwap("drawScene", function drawScene() { /* Do something */ });
要直接回答您的问题,问题在于您正在为一段经过评估的代码赋值。那不行。工作将是:
function fSwap(funcName, code) {
eval(funcName+' = '+code);
}
但请不要这样做。另一种方法是使用回调函数,更简洁。几乎总是最好不要使用
eval
,只要不是绝对需要使用它。(根据,显然使用字符串是绝对必要的,所以一定要使用这段代码)。我来晚了,但以下内容应该可以用于将用户输入字符串作为函数
var foo=function(){alert("foo");};
foo();//alerts 'foo'
function fSwap(funcName, fn) {
eval("newfunc = "+fn);
window[funcName] = newfunc;
}
fSwap("foo","function(){alert('bar');}");
foo();//alerts 'bar'
演示:我参加聚会迟到了,但以下内容应该可以用于将用户输入字符串作为函数
var foo=function(){alert("foo");};
foo();//alerts 'foo'
function fSwap(funcName, fn) {
eval("newfunc = "+fn);
window[funcName] = newfunc;
}
fSwap("foo","function(){alert('bar');}");
foo();//alerts 'bar'
演示:为什么不使用
drawsecene=function(){/*做点什么*/}代码>,根本不需要求值?我想使用用户输入的字符串来分配函数
,根本不需要eval?我想使用用户输入的字符串来分配函数。fSwap的两个参数都是字符串,您的第一个代码段是否仍然有效?@JDong第二段代码(使用eval
)确实可以使用输入的两个字符串。第一个代码要求第二个参数是函数。如果绝对要求两个参数都是字符串,则使用第二个代码。那就行了。不幸的是,我必须使用eval()。如果有更好的方法来获取用户输入函数并将其分配给代码,我仍然洗耳恭听。@JDong,对于这种情况(当函数的源代码是外部的)eval是可以的。只是当它在您这边时不要误用它,您可以将它作为常规函数编写。@JDong如果您运行的是用户提供的代码,那么您将需要使用eval,但请记住,您应该只为用户自己使用它。切勿让用户提供的代码为用户自己以外的任何用户运行,以防止出现重大安全问题。fSwap的两个参数都是字符串,您的第一个代码段是否仍然有效?@JDong第二个代码块(使用eval
)确实可以使用输入的两个字符串。第一个代码要求第二个参数是函数。如果绝对要求两个参数都是字符串,则使用第二个代码。那就行了。不幸的是,我必须使用eval()。如果有更好的方法来获取用户输入函数并将其分配给代码,我仍然洗耳恭听。@JDong,对于这种情况(当函数的源代码是外部的)eval是可以的。只是当它在您这边时不要误用它,您可以将它作为常规函数编写。@JDong如果您运行的是用户提供的代码,那么您将需要使用eval,但请记住,您应该只为用户自己使用它。切勿让用户提供的代码为用户自身以外的任何用户运行,以防止出现重大安全问题代码>必要吗?我感觉像eval(funcName+'='+code)
可能是一个更好的解决方案,因为它不创建临时变量。@JDong是的,你是对的。在我的脑海中,我认为使用window[funcName]
会限制用户只替换已经存在的函数。经过检查,我意识到这是胡说八道;)是窗口[funcName]=newfunc代码>必要吗?我感觉像eval(funcName+'='+code)
可能是一个更好的解决方案,因为它不创建临时变量。@JDong是的,你是对的。在我的脑海中,我认为使用window[funcName]
会限制用户只替换已经存在的函数。经过检查,我意识到这是胡说八道;)