簡體   English   中英

可變變量可以從閉包中訪問

[英]Mutable Variable is in accessible from closures

我是javascript新手。 這是我的代碼

  ......
var filename, result, user=["a", "b", "c","d"];
for(var p=0;p<user.length;p++)
      {
       filename=userID[p]+'_'+user[p]+'.json';

       fs.readFile(filename, function read(err, data)
       {
           if (err) {throw err;}
           result = data.toString();

            if (result.charAt(result.length-1) === ',')
             result = result.substring(0,result.length-1) + ']}';

          console.log(p+filename+result+"\n\n"); //here

            });

         }

在“這里”中,p的值始終顯示最后一個索引,在這種情況下,對於所有迭代,在3中,文件名也是最后一個迭代的文件名。如何在“這里”中獲得正確的p值。 對於p,我的編譯器顯示“可從閉包訪問可變變量”。

@naomik評論似乎是正確的,在循環體內進行任何異步作業始終是個壞主意。 因為循環不會等到響應。

var filename, result, user=["a", "b", "c","d"];
var p=0;
 function readfileUnitil(p)
  {
   filename=userID[p]+'_'+user[p]+'.json';

   fs.readFile(filename,function(err, data)
   {
       if (err) {throw err;}
       result = data.toString();

        if (result.charAt(result.length-1) === ',')
         result = result.substring(0,result.length-1) + ']}';

      console.log(p+filename+result+"\n\n"); //here
        if(p<user.length){
         p++;
         readfileUnitil(p);
        }
        });
   }
 }

我確實更喜歡這種遞歸而不是let變量,因為它更具可讀性,瀏覽器也不會保留內存,希望有所幫助。

在這種情況下, filename作用域是for loop塊, filename值已綁定到fs.readFile 解決此問題的簡單方法,請遵循塊代碼

var filename, result, user = ["a", "b", "c", "d"];
for (var p = 0; p < user.length; p++) {
    filename = userID[p] + '_' + user[p] + '.json';

    (function(file) {
        fs.readFile(filename, function read(err, data) {
            if (err) {
                throw err;
            }
            result = data.toString();

            if (result.charAt(result.length - 1) === ',')
                result = result.substring(0, result.length - 1) + ']}';

            console.log(p + filename + result + "\n\n"); //here

        });

    })(filename)

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM