我想知道如何从AJAX请求中获取函数,如下所示:
假设我有一个名为myfunction.js的文件,如下所示:
function(bar){
alert(bar);
}
我可以通过Ajax作为函数检索它吗?像这样?
var foo = $.ajax({url:'myfunction.js',async:false}).responseText;
然后像这样运行吗?
foo(bar);
我问的原因是因为我知道responseText
是一个字符串,
所以我不确定JavaScript是否会理解它是一个函数。
有没有办法将字符串转换为函数?
答案 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?