2011-09-13 13 views
0

何か私のjavascriptで起こっているwierdと私はそれを理解していません。誰でも説明できますか?Javascriptの文字列キャストの問題

var adsl2pSpeed = '9500 - 12500'; 

     alert(adsl2pSpeed); 

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


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

「未定義」を2回警告し、innerhtmlを「不明」に設定します。 if文をコメントアウトすると、 '9500 - 12500'に警告し、innerHTMLを '9500 - 12500'に設定します。何が起こっていますか?文字列がオブジェクトとしてキャストされているのでnullになりますか?

EDIT:私は実際にadsl2pSpeedを機能に含まれない起動スクリプトとして登録しています。わかりやすくするために移動しましたが、おそらくそれが問題ですか?

+1

テストケースください。インデントを見ると、実際のコードは最初の2行の間にあるものがあります... – ThiefMaster

+0

それはあなたの正確なコードですか?それとも関数の中に何かある? – Thilo

+0

私のためではありません:http://jsfiddle.net/v6D9r/。残りのコードを表示してください。ところで、 'var adsl2pSpeed = 'Unknown'の前に' var'は必要ありません; ...変数adsl2pSpeedはすでに宣言されています。 – Matt

答えて

5

推測:

インデントされたコードは関数内にあります。

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

この関数は、グローバル変数をマスクするローカル変数を宣言しているため、「未定義」になります。

varを削除して、新しい変数を作成しないようにしてください。

+0

+1それが最も明白な原因であるように思えるでしょう。 OPがそれを言いました(それが本当に事実なら...) –

0

私はティロが正しいと思います。 コードのような関数である場合:

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

関数が実際にこのように解釈されるように、次いでif -statement内部adsl2pSpeedの宣言は、関数の先頭に「巻き上げ」されている:

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