功能调用

时间:2011-07-06 12:17:42

标签: javascript jquery

可能是一个简单的问题需要解决...... 在按钮上单击我调用包含文件上的函数并解析函数名称(b)。为什么b不是函数? 我有以下文件(只是问题的一个例子):

comum.js

function f(b){
    var a = eval(b +'();');
}

function a(v){
    $.ajax({url:'update.aspx',
            data: 'q=5',
            success: function(){
                f(v);
            }   
    });
}

default.html中

<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>

5 个答案:

答案 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();
}