2011-08-25 159 views
0

這是我最簡單的代碼:Javascript,變量未被賦值...爲什麼?

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("[email protected]", 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("[email protected]"); 
     this_version = addon.version; 
     alert("rr " + this_version); 
    } 
    alert("rrr " + this_version); 
}, 2000); 

及其該死奇怪,因爲這個閃光兩次alert("r "+this_version);但這alert("rrr "+this_version);總是給我空;(

仍在學習JS,所以這是非常令人費解.. 。請大家幫忙!

謝謝!

+1

當格式化爲 – qwertymk

+0

ok,固定格式 – Ryan

+0

那麼沒有人會打擾你看看你的代碼。並且在單個r的警報之前是否發生了三重r的警報? –

回答

-1

好,解決它通過只移動所有的東西除了警報出計時器:

var this_version =null; 
try { 
    // Firefox 4 and later; Mozilla 2 and later 
    Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
    AddonManager.getAddonByID("[email protected]", 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("[email protected]"); 
    this_version = addon.version; 
    alert("rr " + this_version); 
} 

this.timervar = setTimeout(function() 
          { 



            alert("rrr "+this_version); 


          }, 2000); 
+0

這不是一個可靠的解決方案。等待2秒並不能保證已經設置了'this_version'。 –

0

你的代碼設置this_version變量是回調裏面,所以對變量的變化將不會在反映您的第三個alert執行的範圍。

+0

那麼,如何將這個值存入我的變量中,以便我可以在其他地方使用它? – Ryan

+1

這不是範圍問題,而是時間問題。假設代碼在全局上下文中運行,所有函數都訪問相同的* this_version *變量。即使外部上下文是函數代碼,它們也會對同一個實例有一個閉包,因爲它們的作用域鏈上沒有其他* this_version *。問題在於給定給* setTimeout *的函數在其他函數設置了值之前運行,因此在運行時,設置該值的函數尚未被調用。 – RobG

+1

@Ryan - 大概*組件*正在發出異步的AJAX請求(因此是計時問題)。您可以通過調用同步來解決該問題,但這可能不是您想要的。 – RobG

1

這裏是做在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("[email protected]", 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("[email protected]"); 
    this_version = addon.version; 
    alert("rr " + this_version); 
    done(); 
} 

甚至更好:

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

然後調用它像這樣:

done(this_version);