Javascript 函数调用
可能是一个简单的问题要解决。。。 单击按钮时,我调用include文件上的函数并解析函数名(b)。为什么b不是一个函数? 我有以下文件(仅此问题的一个示例): comum.js default.htmlJavascript 函数调用,javascript,jquery,Javascript,Jquery,可能是一个简单的问题要解决。。。 单击按钮时,我调用include文件上的函数并解析函数名(b)。为什么b不是一个函数? 我有以下文件(仅此问题的一个示例): comum.js default.html $(函数(){ $(“#me”)。单击(函数(){ a(“b”); }); }); 函数b(){ $(#me”).attr(“残疾人”、“残疾人”); } 我不太清楚您想做什么,但是当您使用'b'作为参数调用a时,您传递的是字符'b',而不是函数b的引用 // ---------v----
$(函数(){
$(“#me”)。单击(函数(){
a(“b”);
});
});
函数b(){
$(#me”).attr(“残疾人”、“残疾人”);
}
我不太清楚您想做什么,但是当您使用'b'
作为参数调用a
时,您传递的是字符'b'
,而不是函数b
的引用
// ---------v------ different name so we don't shadow the global "b()" function
function f( func ){
var a = eval( func +'();' );
}
要将对函数
b
的引用传递到a
,请更改a('b')代码>至a(b)
程序最终调用eval('b()')
(在f()
中),但此时无法找到函数b()
,因为它是在lambda函数中本地定义的(在$()
中)
我想您必须将b()
定义为全局函数,以便eval
按您想要的方式工作。为什么不传递一个匿名函数,而不是传递函数名(使用eval
解析它)
它会变成这样,而且会更好
function f(b){
var a = b();
}
function a(v){
$.ajax({url:'update.aspx',
data: 'q=5',
success: function(){
f(function() {
....
});
}
});
}
不要使用eval
更改此项:
a('b');
对此,请改为:
a(b);
然后:
success: function(){
v();
}
虽然其他人认为在这种情况下最好不要使用eval
,但您确实提出了一个尚未回答的特定问题
为什么b不是函数?
原因是您为f()
函数指定了与全局b()
函数同名的参数。因此,当对b
进行求值时,将引用“隐藏”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");
}
因此,这里我将参数更改为func
。现在,当对func
引用的字符串求值时,它将引用全局b()
函数,因为该参数不再存在
仅供参考,另一种方法是将函数作为窗口的属性直接访问,因为全局变量会自动添加为属性
function f( b ){
var a = window[ b ]();
}
现在,您直接从窗口
对象请求b
函数,而不是计算作为变量作用域链成员收到的参数。他想通过eval()调用b;用eval(b+'();')代码>出于某种原因是的。。。我没有注意到,但是在这种情况下,请看影子向导的答案。实际上,我传递了两个或三个函数作为变量a(['a','b'])调用,并希望保留我在所有应用程序中使用的函数,而不是只操作DOM页面的函数。在这种情况下,函数b@user831513:我补充道,这解释了为什么你问题中的代码不起作用。@James:奇怪的是,这个答案实际上有点正确,但原因不同。当字符串'b'
被求值时,它是在f()
函数中完成的,该函数有一个名为b
的参数,该参数返回到传递的原始'b'
字符串。结果是,无论是否使用eval
,OP都在调用'b'()
,而字符串不是函数。这个函数可以工作,如果我需要传递两个函数名,比如a([b,c]),它也可以工作。超级车手们,很高兴它起作用了。如果您最终使用的是这个答案,请随意接受。:)+谢谢你回答这个问题。局部变量b的值是字符串“b”,因此eval将其解析为局部变量b,而不是全局变量b(ECMA-262第10.2.2节适用)。我宁愿看到对全局[b]的引用,也不愿看到窗口[b]。
// ---------v------ different name so we don't shadow the global "b()" function
function f( func ){
var a = eval( func +'();' );
}
function f( b ){
var a = window[ b ]();
}