在最近的项目中用到了第三方的GIS产品,感觉巨垃圾。为了克服性能的问题,决定对JS使用并行下载,顺序执行的策略。首先是借鉴了一本书上的代码,代码是并行下载,也通过eval执行了,但是在window下就是看不到预期的function。在IE8和FireFox下通过都不行。晚上在家了翻阅资料,有人说window.eval和eval在不同的浏览器甚至同一浏览器不同版本下都不一样,在家中IE9下运行终于看到了预期的效果,第二天一大早到公司运行,结果又失败了(IE8)。后来在一国外的网站上终于找到了一段代码,这才算真正解决了自己的问题(做前端开发苦啊!!!呵呵)。废话说了不少了,直接上代码了:
全局执行的代码
globalEval : function globalEval(src) {
if (window.execScript) {
window.execScript(src);
return;
}
var fn = function() {
window.eval.call(window,src);
};
fn();
}
并行下载,顺序执行的代码:
//保证异步按顺序加载JS的代码,此代码后续需要进一步考虑和扩展
sdec.script= {
queuedScripts: new Array(),
loadScriptXHRInject:function(url, onload, bOrder){
var queueLen = sdec.script.queuedScripts.length;
if(bOrder){
var qScript = {response:null, onload:onload,done:false};
sdec.script.queuedScripts[queueLen] = qScript;
}
dojo.xhrGet({
url:url,
load:function(response){
if(bOrder){
sdec.script.queuedScripts[queueLen].response =response;
sdec.script.injectScripts();
}else{
//SuperMap相关的JS文件异步加载完毕,执行JS
sdec.script.globalEval(response);
if(onload){
onload();
}
}
},
error:function(){
console.debug(error.response);
}
});
},
injectScripts:function(){
var len = sdec.script.queuedScripts.length;
for(var i=0;i<len;i++){
var qScript = sdec.script.queuedScripts[i];
if(!qScript.done){
if(!qScript.response){
//停止!需要等待依赖的响应
break;
}else{
sdec.script.globalEval(qScript.response);
if(qScript.onload){
qScript.onload();
}
qScript.done = true;
}
}
}
},
globalEval : function globalEval(src) {
if (window.execScript) {
window.execScript(src);
return;
}
var fn = function() {
window.eval.call(window,src);
};
fn();
}
};[/size][/size]
分享到:
相关推荐
JavaScript中的`eval()`函数是一个非常强大但又颇具争议的功能,它允许执行一个字符串作为JavaScript代码。在本讨论中,我们将深入探讨如何自定义`eval()`函数以提高代码的安全性和效率,同时也会涉及到JavaScript的...
- **全局eval**: 当`eval()`函数在全局作用域被调用时,它将访问全局变量。 例如: ```javascript function foo(a) { eval(a); } foo("return;"); ``` 这段代码将抛出错误,因为在全局上下文中使用`return`会导致...
### 深入认识JavaScript中的eval函数 #### 一、eval函数概述 在JavaScript中,`eval`函数是一个内置函数,它可以将字符串形式的代码解析并执行。这为开发者提供了一种灵活的方式来动态生成和执行代码。然而,由于...
在JavaScript编程语言中,`eval`是一个全局函数,它的主要功能是接收一个字符串参数,该字符串应该包含有效的JavaScript代码,然后`eval`会尝试执行这些代码。如果字符串中的最后一条语句是一个表达式,则`eval`将...
例如,isNaN()函数用于检查一个值是否是NaN(Not-a-Number),isFinite()用于检查一个值是否是有限数,parseInt()用于将字符串转换为整数,eval()函数则用于执行一段JavaScript代码字符串。 4. 全局对象还提供了...
JavaScript中的eval()函数是一个强大的工具,它允许将字符串当作JavaScript代码执行。然而,这个功能也带来了潜在的安全风险和性能问题,因此在实际编程中应当谨慎使用。以下是对eval()函数的详细说明: **eval()的...
1. **沙箱环境**:通过创建一个受限的执行环境,限制了 JavaScript 代码对宿主环境的访问,比如全局变量、系统函数等。 2. **类型检查**:Rust 语言的静态类型系统可以帮助在编译时发现类型错误,防止运行时的异常。...
JavaScript中的eval函数是一个非常强大的内置函数,它允许程序在运行时动态执行JavaScript代码。eval函数接收一个字符串参数,如果这个字符串能够被解析为JavaScript表达式、语句、代码块或程序,则eval会执行这段...
在JavaScript编程中,eval函数是一个非常强大的内置函数,它能够将字符串作为JavaScript代码执行。虽然eval函数非常强大,但同时它也存在安全风险和潜在的性能问题。由于eval可以执行任何JavaScript代码,因此如果...
在某些情况下,可以使用`new Function()`或者`Function`构造函数来代替`eval()`,它们同样可以动态创建函数,但通常被认为比`eval()`更安全,因为它们不会在全局作用域中执行代码。 总的来说,JavaScript的`eval()`...
这是因为JavaScript全局变量在整个脚本中都是可见的,包括在函数内部,除非有同名的局部变量遮蔽它们。 这里的关键点是理解JavaScript的作用域规则。JavaScript有两种作用域:全局作用域和函数作用域。在函数内部...
值得注意的是,`eval`在不同作用域下有不同的行为:如果在全局作用域中,它可以访问和修改全局变量;而在函数作用域中,它通常只能访问局部变量(除非使用`var`声明)。 四、安全问题 `eval()`的主要危险在于它...
2. 使用`window.eval()`:在某些情况下,如果必须使用`eval()`,可以将它限制在全局作用域,通过`window.eval()`调用,这样Closure Compiler可以识别这是一个全局操作。 3. 使用`@nocache`注释:在`eval()`前添加`/...
JavaScript中的`eval()`函数是一个非常特殊且功能强大的工具,它允许我们将字符串当作JavaScript代码执行。在深入探讨`eval()`之前,首先要明确一点:虽然`eval()`在某些情况下非常有用,但它的使用通常被视为一种...
5. `eval()`:这是一个危险的函数,它将字符串作为JavaScript代码执行。使用时需谨慎,因为它可能导致安全问题和性能下降。 6. `isFinite()`:检查给定的数值是否为有限的,返回布尔值。如果值是无穷大或NaN,它会...
JavaScript中的`eval()`函数是一个非常强大但同时也有潜在风险的工具。它允许我们将字符串作为JavaScript代码执行,这在某些场景下非常有用,比如动态执行代码或者解析JSON数据。然而,由于这种特性,`eval()`也成为...
在C#中,JavaScript的`eval()`函数是一个非常强大的功能,它允许动态执行字符串作为JavaScript代码。然而,C#本身并没有直接对应的内置方法。在C#中实现类似JavaScript的`eval()`功能,需要通过编译和运行代码字符串...
"scope-eval"就是这样一个专为前端设计的开源库,它专注于处理JavaScript中的`eval`函数,尤其是与作用域相关的用法。本文将深入探讨`scope-eval`库的功能、工作原理以及它在实际开发中的应用。 `eval()`函数在...
4. **内置属性和方法**:全局对象拥有内置的方法,如`eval()`用于执行字符串形式的JavaScript代码,`setTimeout()`和`clearTimeout()`用于定时器操作,以及`parseInt()`和`parseFloat()`用于转换数字等。 现在,...