2017-04-12 19 views
2

5の代わりに0が表示されるのはなぜですか?typeofとundefinedの奇妙な結果

インサイドHTMLファイル:

<script> 
    var x = 5; 
</script> 
<div id="dv"></div> 

インサイドJSファイル:

$(function() { 
    if(typeof x == 'undefined') { 
    var x = 0; 
    $("#dv").html(x); 
    } else if (x == 5) { 
    $("#dv").html(x); 
    } 
}); 

私はここで何をしないのですか?そのためvariable hoisting in Javascript

+0

を?スクリプトタグの前後に 'x'を付ける場所は? – Ozan

+5

これはIIFE – gurvinder372

+0

@Ozanの中で 'var x'を吊り上げる前です。もちろん、' x = 5'がロードされます。 – blowz

答えて

0

スクリプトことがあるかのようにを走っている:

$(function() { 
    var x; 
    if(typeof x == 'undefined') { 
    x = 0; 
    $("#dv").html(x); 
    } else if (x == 5) { 
    $("#dv").html(x); 
    } 
}); 

だから、xので、それは0に設定することはありませんundefinedに等しいことはありません。関数内の変数xは、ページ内の変数xとは異なる変数です。これは、スクリプト内の変数が関数スコープへのclosed overであるためです。


私はそれをこのように行うだろう正しいあなたの問題を理解していた場合:あなたはJSファイルをロードしない

<body data-x="5"> 
... 
<div id="dv"></div> 

$(function() { 
    var x; 
    if(typeof $('body').data('x') !== 'undefined') { 

    $("#dv").html($('body').data('x')); 
    } else { 
    $("#dv").html(0); 
    } 
}); 
+0

ありがとうございます。では、これを回避する方法は何ですか?そうしないと、呼び出し関数の中で 'x = 5'の' x'を使用できないということですか?なぜなら、呼び出し関数から 'var'を取り除くと、動作してしまうからです。 – blowz

+0

TBH実際の問題は何ですか?なぜxは定義されませんか?この全部は少しの[XY問題]です(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Liam

+0

hehe :)まあ、私は操作しようとしています私が得ている動的変数の結果です。そして、私は結果を確認したい。だから、 'x = undefined'を取得している場合は、' x' = 1'としてページに定義されている場合は '0'に定義したい、' if else'文を使用して特定の結果。'x = 1'と全く同じ' x = 2'だが、別の出力である – blowz