小编Ard*_*eol的帖子

Javascript:在For循环中创建函数

最近,我发现自己需要创建一系列函数.这些函数使用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)包括在最后?

非常感谢你提前.

javascript function

40
推荐指数
3
解决办法
3万
查看次数

Chrome立刻做了什么,Firefox需要30秒

目前,我正在创建一个程序,将源代码转换为突出显示的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("@<&#160;&#160;&#160;&#160;>@");
                continue;
            }
            else …
Run Code Online (Sandbox Code Playgroud)

javascript performance

17
推荐指数
1
解决办法
533
查看次数

标签 统计

javascript ×2

function ×1

performance ×1