JavaScriptvariables范围/提升问题

我有一些非常混淆的问题,从原始文件中设置本地后,从另一个文件中获取variables。 我知道这与吊装有关,但经过一段时间的研究,没有运气,我认为这是值得在这里问。

我试图从我的文件sequencer.js像这样获取设置element

 var nxloader = require('../../helpers/nxloader'); // Load matrix var matrix = nxloader.load('matrix').getElement(); console.log(matrix); 

从设置variables的文件nxloader.js如下所示:

 var $ = require('jquery'); /** * Variable to hold the element that is loaded. */ var element = 'test'; /** * Constructor * * @returns {nxloader} instance of itself */ var nxloader = function () { return this; }; /** * Loads the element passed in * * @param {string} element The element type to load */ nxloader.load = function (element) { // Switch on the element type switch (element) { // Is matrix case 'matrix': // load matrix nx.onload = loadMatrix; break; default: break; } // Implement fluent interface return this; }; /** * Load the matrix element */ var loadMatrix = function () { // Colours nx.colorize("accent", "#ffbb4c"); nx.colorize("fill", "#1D2632"); // Specified size matrix1.col = 16; matrix1.row = 1; matrix1.init(); matrix1.resize($(".step-sequencer-container").width(), $(".step-sequencer-container").height()); // Set the element setElement(matrix1); // Implement fluent interface return this; } /** * Get the element * @return {nxelement} element */ nxloader.getElement = function () { return element; } /** * Local setter */ function setElement (elementToSet) { element = elementToSet; }; module.exports = nxloader; 

正如有些人猜测的那样,当console.log(matrix);sequencer.js文件中返回'test'而不是我所希望的元素。 我知道这与在JavaScript中提起有关,但我很困惑如何解决它。 我想要一个本地setter,以便它不能从其他文件设置。 我希望一旦元素被加载后元素被设置为全局elementvariables,以便另一个文件可以检索这个element并按照它的意愿使用它。

我正在使用具有特定于Webaudio编程的UI元素的NexusUI库。

任何帮助将不胜感激,我认为这是一个非常简单和烦人的问题!

编辑:loadMatrix中的方法loadMatrix实际的代码。 编辑-2:包括链接到NexusUI库

值正在正确设置,但onload函数您的console.log运行后被调用。 所以这个值在logging的时候还没有设置。 您可以通过将日志放入setTimeout函数来certificate这一点。

 setTimeout(function { console.log(matrix); }, 0); 

这会将日志推送到调用堆栈的末尾,并库调用onchange函数之后 ,这意味着您的matrix已准备就绪。

根据你想要构build应用程序的方式,你可以使用callback或Promise来处理这样的asynchronous问题。 或者你可以简单地把你的console.log移动到你知道可以安全访问这个元素的loadMatrix函数中。