繁体   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