2011-02-04 30 views
7

我想知道是否有人可以解释使用Javascript的eval()和另一种方法(如使用JQuery创建脚本标记,然后将该元素附加到页面)之间的区别:eval()和附加脚本标记之间的Javascript差异

eval(somecode); 

$("<script type='text/javascript'>"+somecode+"</script>").appendTo("head"); 

不知道这是否是相关的,但这里的背景:我有一个版本的Drupal的弹出窗口模块,其基本目的是为了轻松地将常规链接到弹出窗口工作通过AJAX处理整个页面请求并将其附加到模态窗口中的页面。这通常包括外部CSS和Javascript文件。为了提高所有这些AJAX加载的性能,我切换到使用AJAX队列,并且将外部脚本的eval()更改为列出的替代方法。但是,这导致各种其他页面上出现零星的Javscript错误。

+1

我看不出如何使用eval来完成jquery的工作。 Eval用于将诸如json响应字符串之类的东西变成数组以及类似的东西。 – 2011-02-04 23:41:43

+0

@MattPhillips评估代码。 – Raynos 2011-02-04 23:46:18

+0

@Matt - jQuery包含一些内部函数,它通过将脚本标记附加到文档中来“评估”代码。IIRC,`globalEval`被jQuery的AJAX函数广泛使用,包括相同域脚本和JSONP。 – 2011-02-05 00:04:30

回答

2

那么一个(只要差异去)是eval将返回一个表达式的结果。

var result = eval('3+4'); // result = 7 

只要你的JavaScript字符串是在脚本块的结构,我建议script标签内将其注入/

+6

更准确。 `eval()`返回最后一个表达式的结果,而script标签不能返回任何东西。 – 2011-02-04 23:45:12

1

我强烈建议使用JSON-P。

通过即时创建脚本节点(使用src = [url])在传出的AJAX请求上添加回调函数名称,并使用json数据调用回调函数。您可以在页面中定义回调函数(正确命名空间)并将更新逻辑放入其中。

动态脚本节点回调的优点是没有像XHR那样的同域限制。

例如,您的网站是www.foobar.com,某些web服务托管在www.foobarapi.com上。您在SRC运行时创建一个脚本节点=“http://www.foobarapi.com/baz?a=foo1 & B = foo2的&回调= foo.bar.baz”

同时在你的页面,你有:

foo.bar.baz = function(data) { 
    // use the data 
} 

而你的后端服务,比如一个PHP,可以关注一下:

$a=$GET['a']; 
$b=$GET['b']; 
$callback = $GET['callback']; 
$c = someCalc($a, $b); 
echo $callback . "({ \"c\" : $c });"; 
1

添加脚本标记将同步加载脚本,而当你加载通过XHR EVAL文本,这是异步加载。由于异步,这些脚本可能是无序加载的。

请注意,有十亿个if-then-then的情况下,但我猜这是基于您的情况的情况。

现在,您可以同步加载XHR,但事情会大大减慢。浏览器可以一次加载六个(ish)脚本,但按顺序执行它们。 XHR将一次加载一个。