2012-11-10 71 views
2

我正在使用一个$ .ajax函数,它有两个用途,根据上下文,我想在回调函数上执行不同的函数。传递函数名称作为参数执行

function MyAjaxCall(SomeParameter, CallBackFunctionName) { 

    $.ajax({ 
    ... 
    success: function (msg) { 

    var TheData = msg.hasOwnProperty("d") ? msg['d'] : msg; 
    // here: "execute the function in parameter CallBackFunctionName 
    // AND pass it the parameter TheData 
    } 
} 

如何编写函数名称是参数的行,并且我想将它作为参数传递给它。

注意,此刻,我正在写它像:

if (CallBackFunctionName === "SomeFunctionName1") { 
    SomeFunctionName1(TheData); 
} else { 
    SomeFunctionName2(TheData); 
} 
+0

是功能全局函数?你为什么不把实际的函数传递给MyAjaxCall方法? – sdepold

回答

4

使用:

window[functionName](arguments); 

如果没有,那么改变的方式MyAjaxCall被称为像这样:

MyAjaxCall.apply(thisArg, [SomeParameter, CallBackFunction]); //thisArg is the value of the this object inside MyAjaxCall(). 

内。然后MyAjaxCall()做到这一点:

function MyAjaxXall(SomeParam, CallBackFunction){ 
    var me = this; //the object supplied through thisArg while calling. 
    $.ajax({ 
    success : function(msg) 
    { 
     //whatever processing you want 
     me[CallBackFunction](arguments); 
    } 

    }); 
} 

或者你可以添加的对象为MyAjaxCall()的paramters的一部分:

function MyAjaxCall(SomeParam, obj, CallBackFunction) 
{ 

     $.ajax({ 
     success : function(msg) 
     { 
      //whatever processing you want 
      obj[CallBackFunction](arguments); 
     } 

     }); 
} 

使用摄像机时调用全局函数使用:

MyAjaxCall(SomeParam, window, CallBackFunction); 
+0

好的,谢谢你的回答。 Upvoted因为这个概念,但我保持我的实现,因为它更简单。再次感谢。 – frenchie

2

假设其名称通过变量CallBackFunctionName通过定义的函数是全球性的,你可以这样做:

window[CallBackFunctionName](TheData) 

你也可以只通过实际的功能MyAjaxCall这样的:

var MyCallbackFunction = function(data){ console.log(data) } 
MyAjaxCall({param1: 'value1'}, MyCallbackFunction) 

这样你就可以只执行功能:如果函数被定义为全局函数

function MyAjaxCall(SomeParameter, CallBackFunction) { 

    $.ajax({ 
    ... 
    success: function (msg) { 

    var TheData = msg.hasOwnProperty("d") ? msg['d'] : msg; 
    CallBackFunction(TheData) 
    } 
} 
+0

实际上,它都在一个闭包中,并且这些功能都不能从全局范围访问。 – frenchie

+0

好的,谢谢你的回答。 Upvoted因为这个概念,但我保持我的实现,因为它更简单。再次感谢。 – frenchie

相关问题