eval()和附加脚本标记之间的Javascript差异

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

eval(somecode); 

 $(""+somecode+"").appendTo("head"); 

不确定这是否相关,但这里是上下文:我正在使用Drupal Popups模块的一个版本,其基本目的是通过AJAX整个页面请求轻松将常规链接转换为弹出窗口并将其附加到页面中模态窗口。 这通常包括外部CSS和Javascript文件。 为了提高所有这些AJAX加载的性能,我转而使用AJAX排队,并将外部脚本的eval()更改为列出的替代方案。 但是,这会在其他各个页面上引发零星的Javscript错误。

好吧一个(就差异而言)是eval将返回表达式的结果。

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

只要您的javascript字符串在脚本块的结构中,我建议将其注入脚本标记/

添加脚本标记将同步加载脚本,而在通过XHR评估文本时加载,这是异步加载的。 由于异步,脚本可能无序加载。

请注意,有十亿个if-but-then案例,但我猜这是基于你的场景的情况。

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

我强烈建议使用JSON-P。

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

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

例如,您的网站是www.foobar.com,一些网络服务托管在www.foobarapi.com上。 你在运行时用src =“http://www.foobarapi.com/baz?a=foo1&b=foo2&callback=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 });";