Javascript 函数调用

Javascript 函数调用,javascript,jquery,Javascript,Jquery,可能是一个简单的问题要解决。。。 单击按钮时,我调用include文件上的函数并解析函数名(b)。为什么b不是一个函数? 我有以下文件(仅此问题的一个示例): comum.js default.html $(函数(){ $(“#me”)。单击(函数(){ a(“b”); }); }); 函数b(){ $(#me”).attr(“残疾人”、“残疾人”); } 我不太清楚您想做什么,但是当您使用'b'作为参数调用a时,您传递的是字符'b',而不是函数b的引用 // ---------v----

可能是一个简单的问题要解决。。。 单击按钮时,我调用include文件上的函数并解析函数名(b)。为什么b不是一个函数? 我有以下文件(仅此问题的一个示例):

comum.js default.html

$(函数(){
$(“#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 ]();
}