2011-09-13 110 views
0

我的JavaScript中發生了一些奇怪的事情,我不明白它。誰能解釋一下?JavaScript字符串鑄造問題

var adsl2pSpeed = '9500 - 12500'; 

     alert(adsl2pSpeed); 

     if (!adsl2pSpeed) { 
      alert(adsl2pSpeed); 
      var adsl2pSpeed = 'Unknown'; 
     } 


     var speed = document.getElementById("PredictedSpeed"); 
     speed.innerHTML = adsl2pSpeed + " b/s"; 

這會警告「未定義」兩次,並將innerhtml設置爲「未知」。如果我註釋掉它的提示是'9500 - 12500',並將innerHTML設置爲'9500 - 12500'。發生了什麼?該字符串是否作爲對象進行投射,因此它變爲空?

編輯:我實際上將adsl2pSpeed作爲啓動腳本不在函數中註冊。爲了清楚起見,我把它移開了,但可能是這個問題?

+1

測試用例請。查看縮進真正的代碼之間的前兩行... – ThiefMaster

+0

是你的確切代碼?或者是某種功能? – Thilo

+0

不適合我:http://jsfiddle.net/v6D9r/。向我們展示其餘的代碼。順便說一句,在var var adsl2pSpeed ='Unknown'之前,你不需要'var';'...變量adsl2pSpeed已經被聲明。 – Matt

回答

5

猜測:

縮進的代碼在函數中。

if (!adsl2pSpeed) { 
     alert(adsl2pSpeed); 
     var adsl2pSpeed = 'Unknown'; 
    } 

你在這個函數中聲明瞭一個局部變量,它掩蓋了全局變量,所以它看起來「未定義」。

嘗試刪除var以避免產生新變量。

+0

+1看起來這是最明顯的原因。如果OP提到那將有所幫助(如果確實如此...) –

0

我認爲Thilo是對的。 如果代碼是像一個函數:

var adsl2pSpeed = '9500 - 12500'; 

function test() { 
alert(adsl2pSpeed); 
if (!adsl2pSpeed) { 
    alert(adsl2pSpeed); 
    var adsl2pSpeed = 'Unknown'; 
} 
var speed = document.getElementById("PredictedSpeed"); 
speed.innerHTML = adsl2pSpeed + " b/s"; 
} 

// some code runs ... 

test(); 

那麼adsl2pSpeedif語句來裏面的聲明「懸掛」在函數的頂部,從而使函數實際上這樣解釋:

function test() { 
var adsl2pSpeed; // declaration hoisted to the top, shadows the global var 
alert(adsl2pSpeed); 
if (!adsl2pSpeed) { 
    alert(adsl2pSpeed); 
    adsl2pSpeed = 'Unknown'; // assignment to local var 
} 
var speed = document.getElementById("PredictedSpeed"); 
speed.innerHTML = adsl2pSpeed + " b/s"; 
} 

這篇文章解釋它:http://bustingseams.blogspot.com/2009/08/another-javascript-pitfall-hoisting.html