Javascript,未分配变量。。。为什么?

Javascript,未分配变量。。。为什么?,javascript,variable-assignment,Javascript,Variable Assignment,以下是我最简单的代码: var this_version =null; this.timervar = setTimeout(function () { try { // Firefox 4 and later; Mozilla 2 and later Components.utils.import("resource://gre/modules/AddonManager.jsm"); AddonManager.getAddonByID(

以下是我最简单的代码:

var this_version =null;

this.timervar = setTimeout(function () {
    try {
        // Firefox 4 and later; Mozilla 2 and later
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
        AddonManager.getAddonByID("parasites@maafire.com", function(addon) {
            this_version = addon.version;
            alert("r "+this_version);
        });
    } catch (ex) {
        // Firefox 3.6 and before; Mozilla 1.9.2 and before
        var em = Components.classes["@mozilla.org/extensions/manager;1"]
            .getService(Components.interfaces.nsIExtensionManager);
        var addon = em.getItemForID("parasites@maafire.com");
        this_version = addon.version;
        alert("rr " + this_version);
    }
    alert("rrr " + this_version);
}, 2000);
这太奇怪了,因为它会发出两次
警报(“r”+这个版本)但此
警报(“rrr”+此版本)总是给我空值;(

仍然在学习JS,所以这是相当令人困惑的…请帮助


谢谢!

设置
此版本的
变量的代码在回调中,因此对变量的更改不会反映在第三个
警报执行的范围内。

好,只需将警报之外的所有内容移出计时器即可解决此问题:

var this_version =null;
try {
    // Firefox 4 and later; Mozilla 2 and later
    Components.utils.import("resource://gre/modules/AddonManager.jsm");
    AddonManager.getAddonByID("parasites@maafire.com", function(addon) {
        this_version = addon.version;
        alert("r "+this_version);
    });
} catch (ex) {
    // Firefox 3.6 and before; Mozilla 1.9.2 and before
    var em = Components.classes["@mozilla.org/extensions/manager;1"]
        .getService(Components.interfaces.nsIExtensionManager);
    var addon = em.getItemForID("parasites@maafire.com");
    this_version = addon.version;
    alert("rr " + this_version);
}

this.timervar = setTimeout(function ()
                            { 



                                    alert("rrr "+this_version);


                            }, 2000);

下面是在JavaScript世界中执行此操作的正确方法:

function done() {
    alert("rrr "+this_version);
}

var this_version =null;
try {
    // Firefox 4 and later; Mozilla 2 and later
    Components.utils.import("resource://gre/modules/AddonManager.jsm");
    AddonManager.getAddonByID("parasites@maafire.com", function(addon) {
        this_version = addon.version;
        alert("r "+this_version);
        done();
    });
} catch (ex) {
    // Firefox 3.6 and before; Mozilla 1.9.2 and before
    var em = Components.classes["@mozilla.org/extensions/manager;1"]
        .getService(Components.interfaces.nsIExtensionManager);
    var addon = em.getItemForID("parasites@maafire.com");
    this_version = addon.version;
    alert("rr " + this_version);
    done();
}
或者更好:

function done(version) {
    alert("rrr "+version);
}
那么就这样称呼它:

done(this_version);

当你的代码被格式化成那样的时候,没有人会费心去看你的代码。那么单r的警报是什么呢?三r的警报是在单r的警报之前发生的吗?首先,我得到
R0.5
然后
rrr null
然后
R0.5
然后
rrr null
那么,我如何将该值输入我的变量中呢我可以在其他地方使用它?这不是一个范围问题,而是一个时间问题。考虑到代码在全局上下文中运行,所有函数都在访问相同的this\u版本变量。即使外部上下文是函数代码,它们也会对同一实例进行闭包,因为它们的范围链上没有其他this\u版本问题是,赋予setTimeout的函数在其他函数设置值之前运行,因此在它运行时,设置值的函数还没有被调用。@Ryan-可能组件正在发出异步AJAX请求(因此存在计时问题)。您可能可以通过使调用同步来解决此问题,但这可能不是您想要的。由于这是异步运行的,我认为这是一个时间问题,这就是为什么我将它放入settimeout中…希望这2秒钟足以使它获得所需的内容并更新我可以在其他地方使用的主变量…但这不起作用,y如何处理您建议我这样做吗?使用setTimeout调用组件只会延迟所有操作。您可以尝试使用setInterval进行轮询(因为XHR可能永远不会成功完成,因此无法设置变量)。您可能需要一个控制器函数,当XHR调用时会被告知该函数,以便控制器设置一个标志(对象属性,无论什么)。让回调在完成时告诉它,这样它会清除标志。每次返回时,控制器会检查是否有任何内容需要清除。如果全部完成,它会继续处理。这不是一个可靠的解决方案。等待2秒钟并不保证已设置了
此版本。