javascript获取函数参数名称/值

时间:2012-11-22 13:32:07

标签: javascript ajax

在函数内部,我可以得到它的参数名称/值吗?

我希望将它们变成一个我可以JSON.stringify()的对象,这样我就可以将它作为数据传递给ajax调用。

[编辑] 感谢其他人指出我正确的方向,我有一个解决方案,动态创建与web方法匹配的参数,以及与web方法匹配的客户端存根。我认为,这有助于使事情更具可读性。

[EDIT2] 更进一步。现在,javascript中的函数名称必须与webmethod的名称匹配,现在您将其作为webmethod所在页面的第一个参数传递给它。它动态地获取客户端javascript函数名称,这就是它现在为web方法所寻找的内容。

以下是您在代码中创建的常用方法:

    function WebMethodCall(args) {
        // in your stubs call this to get argname/value pairings in JSON form
        var params = JSONArgs(args);
        var fun = GetFunctionName(args);

        // make a call to the webmethod via ajax using json
        AjaxPostJSON(args[0] + "/" + fun, params, args);
    }

function JSONArgs(args) {
        var tmp = args.callee.toString().match(/\(.*?\)/)[0];
        var argumentNames = tmp.replace(/[()\s]/g, '').split(',');

        var param = new Object();
        for (var i = 0; i < argumentNames.length; i++) {
            param[argumentNames[i]] = args[i];
        }

        return JSON.stringify(param);
    }

    function GetFunctionName(args) {
        var fName = args.callee.toString().match(/function ([^\(]+)/)[1]

        return fName;
    }


    function AjaxPostJSON(url, data, args) {
        var objGetData = new Object();
        var fun = GetFunctionName(args);
        var s = "On" + fun + "Success";
        var f = "On" + fun + "Failure";

        objGetData.url = url;
        objGetData.type = "POST";
        objGetData.data = data;
        objGetData.contentType = "application/json; charset=utf-8";
        objGetData.dataType = "json";
        objGetData.success = window[s];
        objGetData.error = window[f];

        $.ajax(objGetData);
    }

参数名称应与webmethod参数名称匹配的存根。函数名称必须也与webmethod函数名称匹配。请注意,页面必须是第一个参数,但不应该在您的webmethod中。它只是用来使呼叫正确:         //功能存根         function GetData(page,id,name){             WebMethodCall(参数);         }

注意“On”+ func_name +“Success”/“Failure”的成功和失败名称模式。用法:

    function Button2_onclick() {
        // call client side stub that matches the webmethod
        GetData("Default.aspx", 8, "Bob");
    }

    // automatically registers these as success/error
    function OnGetDataSuccess(data) {
        alert(data.d);
    }

    function OnGetDataFailure(data) {
        alert("failure");
    }

我认为,关于这一点的好处是,当我更改/添加参数到我的webmethod时,只需获取客户端javascript方法并更改参数名称以匹配webmethod即可,这就很容易了。

4 个答案:

答案 0 :(得分:1)

您可以使用arguments对象获取值。名称有点棘手,你必须解析函数的字符串表示。

我更喜欢直接将对象传递给函数:myFunction({name: value})并将该对象直接传递给JSON.stringify

答案 1 :(得分:1)

如果我理解你,你想获得变量的“名称”作为“值”,如果是这样,不,你不能,变量名只是一个符号,可以帮助你作为一个程序员可以区分它们,但是你无法获得那些“元数据”信息,这就是为什么我们现在更喜欢使用json来提供一个更有意义的对象作为数据传输对象。

答案 2 :(得分:1)

这有帮助吗?:

function test (name, pass){
    var params = (test.toString().substring(test.toString().indexOf('(')+ 1, test.toString().indexOf(')'))).replace(/ /g, '').split(',');
    var obj = new Object();
    var js = "";
for(var i=0;i<arguments.length;i++){
        js += 'obj.'+ params[i]+' = "'+ arguments[i]+'";';
    }
     eval(js);
     JSON.stringify(obj);
}

答案 3 :(得分:0)

是的,你可以...但这真的是一件简单的事情,谷歌会帮助

function myFunction(name,job) {
 alert("Welcome " + name + ", the " + job);
}