簡體   English   中英

在匿名函數之外訪問變量

[英]Accessing variable outside of Anonymous Function

我知道這可能是重復的,但我只是想不通該怎么做(相信我,我已經搜索過,我試圖弄弄代碼)。 我有以下代碼正在構建一個文件表,您將它們拖放到應用程序中。

function CreateTrackTable (data, length) {

    var fs = require('fs'),
        mm = require('musicmetadata'),
        i  = 0;

    for (i; i < length; ++i) { 

        var mimeType = data.dataTransfer.files[i].type;

        if (mimeType == "audio/mp3" || mimeType == "audio/x-m4a"){

                FilePath = data.dataTransfer.files[i].path;
                var parser = mm(fs.createReadStream(FilePath));

            parser.on('metadata',  function (result) {

                if (result.picture.length == 0) {
                    $("#track-table").append('<tr path="'+ FilePath +'"><td></td></tr>');
                }else{
                    var picture = base64ArrayBuffer(result.picture[0].data);
                    $("#track-table").append('<tr path="'+ FilePath +'"><td></td></tr>');     
                }
            });
        }
    } 
}

問題是FilePath變量是可訪問的,但是它始終“打印”相同的路徑,而不是循環i所遵循的路徑。

該應用程序是使用nodo-webkit構建的,一切正常,這是我無法解決的唯一問題。

謝謝您的幫助!

在循環內創建的每個函數都將關閉相同的FilePath (即它們各自沒有得到自己的副本),這意味着它們每次執行時都將看到變量具有的任何值。 為了使這項工作,你如何期望,你需要安排它,這樣他們各自獲得自己的拷貝。 由於JavaScript變量的作用域是最接近的封閉函數,因此,該方法是將函數創建包裝在立即調用的函數中,該函數接收所需的值作為參數:

(function(FilePath) {
    parser.on('metadata',  function (result) {
        if (result.picture.length == 0) {
            $("#track-table").append('<tr path="'+ FilePath +'"><td></td></tr>');
        } else {
            var picture = base64ArrayBuffer(result.picture[0].data);
            $("#track-table").append('<tr path="'+ FilePath +'"><td></td></tr>');     
        }
    });
})(FilePath);

在這種情況下,每個新函數都將關閉一個新FilePath ,從而產生所需的結果。

暫無
暫無

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

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