节点js - Wierd变量范围

时间:2014-06-17 09:57:53

标签: node.js variables

这是我用来浏览目录的代码:

var path = 'D:/Syslog/live';
listDir(path);

function listDir (path) {
    fs.readdir(path, function(err, files)
    {
        console.log(files);
        for( i = 0; i < files.length; i++)
        {
            var fullPath = path + "/" + files[i];
            fs.stat(fullPath, function(err, stats){
               if (stats.isDirectory())
               {
                   listDir(fullPath);
               } else
               {
                   console.log(files[i]);
               }
               });
        }
    });
}

当我调试并使用变量fullPath时,它工作正常,如果我使用files[i](在级别中声明,我未定义

1 个答案:

答案 0 :(得分:2)

由于它是异步循环,i的迭代速度比其余代码快得多。您可以使用匿名闭包函数来冻结循环中的i

查看closures

受欢迎的async库也适用于此类内容。

function listDir(path) {
    fs.readdir(path, function(err, files) {
        console.log(files);
        for (i = 0; i < files.length; i++) {
            (function(i) {
                var fullPath = path + "/" + files[i];
                fs.stat(fullPath, function(err, stats) {
                    if (stats.isDirectory()) {
                        listDir(fullPath);
                    } else {
                        console.log(files[i]);
                    }
                });
            })(i);
        }
    });
}

如果您使用的是异步库,它看起来与此类似

var async = require('async');

function listDir(path) {
    fs.readdir(path, function(err, files) {
        console.log(files);
        async.each(files, function(file, callback) {
            var fullPath = path + "/" + file;
            fs.stat(fullPath, function(err, stats) {
                if (stats.isDirectory()) {
                    listDir(fullPath);
                } else {
                    console.log(file);
                }
                callback();
            });
        });
    });
}

经过测试和工作。