Javascript, переменная не присваивается ... почему? - PullRequest
0 голосов
/ 25 августа 2011

Вот мой самый простой код:

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);

и это чертовски странно, потому что это срабатывает дважды alert("r "+this_version);, но это alert("rrr "+this_version); всегда дает мне ноль; (

Все еще учусьJS, так что это довольно загадочно ... пожалуйста, помогите!

Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

Хорошо, решил, просто переместив все вещи, кроме предупреждения из таймера:

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);
0 голосов
/ 14 июля 2013

Вот правильный способ сделать это в мире 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);
0 голосов
/ 25 августа 2011

Ваш код, который устанавливает переменную this_version, находится внутри обратного вызова, поэтому изменения в переменной не будут отражены в области, в которой выполняется ваш третий alert.

...