通过AJAX获取功能

时间:2011-09-12 19:44:05

标签: javascript jquery ajax

我想知道如何从AJAX请求中获取函数,如下所示:

假设我有一个名为myfunction.js的文件,如下所示:

function(bar){
 alert(bar);
}

我可以通过Ajax作为函数检索它吗?像这样?

var foo = $.ajax({url:'myfunction.js',async:false}).responseText;

然后像这样运行吗?

foo(bar);

我问的原因是因为我知道responseText是一个字符串,
所以我不确定JavaScript是否会理解它是一个函数。

有没有办法将字符串转换为函数?

4 个答案:

答案 0 :(得分:3)

在JS文件中,为该函数命名。

function foo(bar){
   alert(bar);
}

然后使用$.getScript加载它。

$.getScript('myfunction.js', function(){
   foo('test');
});

答案 1 :(得分:1)

绝对:

foo = eval('(' + foo + ')');

foo(bar);

您可以使用new Function,但在我的测试中,它不适用于某些版本的IE。

答案 2 :(得分:1)

我最终使用了新的Function而不是eval,eval在解析后立即执行代码,这不是我所追求的。

这就是我最终做的,它在firefox,chrome和IE 7+中运行得非常好(完全没有错误)

function createMyFunction(code){return new Function('params',code)};

var thecode = $.ajax({
                  url:      'myCode.js',
                  async:     false,
                  dataType: 'html'

               }).responseText

myFunction = createMyFunction(thecode);

我知道createMyFunction在无法定义不同参数方面非常懒惰,但使用单个参数映射非常适合我的模板场景。

注意ajax请求中的dataType:'html',如果你没有指定纯文本mime类型,jQuery实际上会认识到你正在获取JS代码并尝试解析它,这通常最终会抛出一个解析错误或有时“Uncaught TypeError:params未定义”。

通过这种方式,我可以拥有指定模板特定事件的模板文件,并使其组织方式与该模板的标记和css文件相同。

感谢大家的帮助,我选择答案的原因是因为最后的链接指向了正确的方向。

干杯, d

答案 3 :(得分:0)

要注意一件事。

Chrome和IE不允许您直接评估匿名功能(FF很好)。那是

// Throws Syntax Error in Chrome, Object expected in IE 8
var fun = eval('function(){return 5}'); fun(); 

一个hackaround是将它放在一个数组中,对于未来似乎不太可靠:

var fun = eval('[function (){return 5}][0]'); fun();

唯一安全的方法是确保您的函数被命名,因为以下在所有浏览器中都可以正常工作:

eval('function a(){return 5}]'); a(0);

有关进一步的讨论,请参阅Are eval() and new Function() the same thing?