这个其中的原理是什么
发布于 9 年前 作者 SevenSharp 3483 次浏览 最后一次编辑是 8 年前 来自 问答

var fs = require(‘fs’); var stdin = process.stdin, stdout = process.stdout; fs.readdir(process.cwd(), function (err,files) { var i = 0; console.log(files); while (i < files.length) { // file(i); //为什么必须封装到函数里,输出才是正确的? … var fn = files[i]; fs.stat(__dirname + ‘/’ + fn, function (err, stat) { if (stat.isDirectory()) { console.log(i + “.” + fn + “目录.”); } else { console.log(i + “.” + fn);

        }
       //...................................................    
    });
    i++;
    
}

function file(i) {
    var fn = files[i];
    fs.stat(__dirname + '/' + fn, function (err, stat) {
        if (stat.isDirectory()) {
            console.log(i + "." + fn + "目录.");
        }
        else {
            console.log(i + "." + fn);
        
        }

    });

}

});

8 回复

自己顶

不然的话,出什么错误?

错误输出: 错误.jpg 正确输出: 正确.jpg

@leapon 看我楼下的图片

错误原因是变量 i 被循环改了,fs.stat 的回调函数执行的时候,i 都变成 9 了。

@leapon 循环执行比回调函数快?所以以后写回调函数的时候,最好封装成一个函数?

不封装到函数的话,在fs.stat的callback中的i是对i的引用,因此实际用到的时候值已经变成9了。如果封装成函数,那么函数中的i是在调用此函数时的值,也就是从0-8都有。 楼主可以进一步看看关于Closure的东东: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Creating_closures_in_loops.3a_A_common_mistake

@SevenSharp 函数有scope,和执行快慢无关。你多看看 function scope,closure 方面的文章吧。

回到顶部