2012-06-10 4 views
14

この問題は決して満たされず、理由もわかりません。 唯一の説明はスコープの問題です。これは、エラーが表示されますjavascriptはスクリプトタグでスコープを定義していますか?

... 
<script type="text/javascript"> 
    go(); 
    </script> 

    <script type="text/javascript"> 
    function go() 
    { alert(''); } 
    </script> 
... 

:同じページで

、私はJSの2つのセクションを持っている

... 
    <script type="text/javascript"> 
     go(); 

     function go() 
     { alert(''); } 
     </script> 
    ... 

がどこにあるかGoは

を定義されていません。働いている(明らかに)。

<script>タグはJSのスコープを作成しますか? ?

+7

スクリプトタグを使用すると、最初に関数を定義してから呼び出す必要があります。 – undefined

答えて

20

これは範囲の問題ではありません。 1つのスクリプト要素に(グローバルスコープで)関数を定義すると、それを別のスクリプト要素で使うことができます。

ただし、スクリプト要素は解析され、発生したときに実行されます。

ホイスト機能はスクリプト要素間では機能しません。後のスクリプト要素で定義された関数は、以前のスクリプト要素の最初の実行中は使用できません。

スクリプト要素の順序を入れ替えるか、関数呼び出しを定義したスクリプトが実行されるまで関数呼び出しを遅らせる(たとえば、onloadイベントハンドラにアタッチする)必要があります。

<script> 
    function go() { 
     alert(''); 
    } 
</script> 
<script> 
    go(); 
</script> 

または

<script> 
    window.addEventListener("load", function() { 
     go(); 
    }, false); 
</script> 
<script> 
    function go() { 
     alert(''); 
    } 
</script> 
+0

あなたの最初のコードが動作しません...(私のサンプルのような)あなたはそのコードを書くことを意味しましたか? –

+1

あなたの最初の例はまだ間違った方法です:) – floorish

+0

@floorish - おっとり。キャッチをありがとう! – Quentin

7

HTMLパーサーは、次の要素に移動する前にスクリプトを実行するために停止します。次のスクリプト要素 は、最初のスクリプト要素が実行されるまで実行されません。

これは、に匹敵する:最初のスクリプトブロックに構文エラーがあり、その全体が拒否されたが、2番目のブロックが上で動作し、ミスの場合は見かけの誤差があるとして

<script> 
document.getElementById("hello") //null because the html parser hasn't met the div yet. 
</script> 
<div id="hello"></div> 
1

この他の原因そのバディコード。

関連する問題