【问题标题】:Accessing variable outside of Anonymous Function在匿名函数之外访问变量
【发布时间】:2014-04-09 17:28:34
【问题描述】:

我知道这可能是重复的,但我就是不知道该怎么做(相信我,我已经搜索过了,我试图摆弄代码)。我有以下代码,它正在构建一个文件表,您可以将这些文件拖放到应用程序中。

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 构建的,一切正常,这是我唯一想不通的问题。

感谢您的帮助!

【问题讨论】:

  • 您要查找的关键字是closure stackoverflow.com/questions/750486/… BTW,在这里您应该使用var FilePath 在全局范围内不设置变量,即使使用闭包也可以解决此问题
  • 看看能不能从result的元数据中得到你想要的路径。 .on() 是一个事件处理器,所以它是异步的,不是线性的。
  • 这里应该可以工作:jsfiddle.net/EUh3m(应该使用 pasteBin... 太晚了)。它正在关闭 A. Wolff 发布的链接。

标签: javascript jquery node.js node-webkit


【解决方案1】:

在循环中创建的每个函数都在相同的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,从而产生所需的结果。

【讨论】:

  • 谢谢!这项工作 - 只是最后缺少一个括号 - }(FilePath)); - 这是完美的作品。
  • 理解为什么这是有效使用闭包的关键。
猜你喜欢
  • 2020-08-19
  • 2019-05-11
  • 2015-08-08
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多