[英]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.