最近,我发现自己需要创建一系列函数.这些函数使用XML文档中的值,我使用for循环运行相应的节点.但是,在执行此操作时,我发现只有XML表的最后一个节点(对应于for循环的最后一次运行)才被数组中的所有函数使用.
以下是展示此内容的示例:
var numArr = [];
var funArr = [];
for(var i = 0; i < 10; ++i){
numArr[numArr.length] = i;
funArr[funArr.length] = function(){ return i; };
}
window.alert("Num: " + numArr[5] + "\nFun: " + funArr[5]());
Run Code Online (Sandbox Code Playgroud)
输出为Num:5和Fun:10.
经过研究,我找到了一段有效的代码,但我很难理解为什么它有效.我用这个例子在这里复制了它:
var funArr2 = [];
for(var i = 0; i < 10; ++i)
funArr2[funArr2.length] = (function(i){ return function(){ return i;}})(i);
window.alert("Fun 2: " + funArr2[5]());
Run Code Online (Sandbox Code Playgroud)
我知道它与范围界定有关,但乍一看似乎它与我的天真方法没有任何不同.我有点像Javascript的初学者,所以如果我可能会问,为什么使用这个函数返回函数技术会绕过作用域问题?另外,为什么(i)包括在最后?
非常感谢你提前.
目前,我正在创建一个程序,将源代码转换为突出显示的HTML文本.但是,当我测试它时,我发现了一些奇怪的结果.在Chrome上,该程序几乎可以即时解析1000行源代码.但是,Firefox需要30秒才能解析相同的1000行.而且,具有讽刺意味的是,IE10只需要18秒.
现在,我了解不同的浏览器以不同的方式实现javascript,并且Chrome往往更快,但我不明白为什么它会使Firefox超过30倍.我在每个操作上进行了10,000,000,000次操作的原始循环测试,并且花了14秒和Chrome 12.因此,我倾向于相信我的代码中某处需要Firefox需要很长时间才能完成; 我做过研究,但到目前为止我发现的任何内容都没有表明我所看到的巨大差异.
那么,有没有人对可能导致这种情况的原因有任何建议?我已经发布了下面代码的问题区域(注释掉这部分导致两个浏览器即时解析). start并且end都是正则表达式; istream是源代码的来源,ostream也是解析代码所在的位置. istream.read()调用String slice()方法.最后,在整个程序中多次调用此函数.
function(buffer, istream, ostream){
if(start.test(istream.content)){
buffer = istream.read();
ostream.write('[[span class="' + type + '"]]' + buffer);
do{
/* Special Cases */
if(end.test(ostream.content + istream.peek()) && (istream.peek() == "\n" || istream.peek() == " " || istream.peek() == "\t")){
include = true;
break;
}
else if(istream.peek() == "\n"){
istream.read();
ostream.write('[[/span]][[/span]]\n[[span class="line"]][[span class="' + type + '"]]');
continue;
}
else if(istream.peek() == "\t"){
istream.read();
ostream.write("@<    >@");
continue;
}
else …Run Code Online (Sandbox Code Playgroud)