可能是一个简单的问题需要解决...... 在按钮上单击我调用包含文件上的函数并解析函数名称(b)。为什么b不是函数? 我有以下文件(只是问题的一个例子):
function f(b){
var a = eval(b +'();');
}
function a(v){
$.ajax({url:'update.aspx',
data: 'q=5',
success: function(){
f(v);
}
});
}
<html>
<head>
<title></title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="comum.js"></script>
<script language="JavaScript" type="text/javascript">
$(function(){
$("#me").click(function(){
a('b');
});
});
function b(){
$("#me").attr("disabled","disabled");
}
</script>
</head>
<body>
<input type="button" id="me" value="click me" />
</body>
</html>
答案 0 :(得分:1)
虽然其他人是正确的,但在这种情况下最好不要使用eval
,但您确实提出了一个尚未回答的具体问题。
“为什么b不是函数?”
原因是您为f()
函数提供了与全局b()
函数同名的参数。因此,当b
被评估时,会引用“shadowing” b
函数的b
参数。
function f(b){ // <-- Parameter with same name as function.
var a = eval(b +'();'); // <-- So the eval is a reference right back to the
} // 'b' parameter (a string) instead of the
// 'b' function.
// global function b
function b(){
$("#me").attr("disabled","disabled");
}
正如您所看到的,eval()
是从局部变量范围执行的,并且在范围链中找到的第一个b
与您传递给的b
相同EVAL。
您需要做的就是将参数名称更改为b
以外的其他名称。
// ---------v------ different name so we don't shadow the global "b()" function
function f( func ){
var a = eval( func +'();' );
}
所以我在这里将参数更改为func
。现在,当func
引用的字符串被评估时,它将引用全局b()
函数,因为该参数不再存在。
仅供参考,另一种方法是直接作为window
的属性访问函数,因为全局变量会自动添加为属性。
function f( b ){
var a = window[ b ]();
}
现在,您要从b
对象直接询问window
函数 ,而不是评估您作为变量作用域链成员收到的参数。 / p>
答案 1 :(得分:0)
我不确定您要尝试做什么,但是当您使用a
作为参数调用'b'
时,您传递的是字符'b'
,而不是参考函数b
。
要将对b
函数的引用传递给a
,请将a('b');
更改为a(b);
。
答案 2 :(得分:0)
程序最终调用eval('b()')
(在f()
中),但此时无法找到函数b()
,因为它是在lambda函数中本地定义的(在{ {1}})。
我想您必须将$()
定义为全局函数,才能让b()
以您想要的方式工作。
答案 3 :(得分:0)
为什么不直接传递匿名函数而不是传递函数的名称(使用eval
解析它)?
它会变成这样,而且它会更好。
function f(b){
var a = b();
}
function a(v){
$.ajax({url:'update.aspx',
data: 'q=5',
success: function(){
f(function() {
....
});
}
});
}
答案 4 :(得分:0)
请勿使用eval
。
改变这个:
a('b');
改为:
a(b);
然后:
success: function(){
v();
}