20

この問題に遭遇したことはなく、理由もわかりません。唯一の説明は範囲の問題です。

同じページに、JS の 2 つのセクションがあります。

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

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

これはエラーを表示します: go is not defined

どこ

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

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

動作しています(明らかに)。

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

4

3 に答える 3

27

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

ただし、スクリプト要素は検出された時点で解析および実行されます。

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

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

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

また

<script>
    window.addEventListener("load", function () { 
        go();
    }, false);
</script>
<script>
    function go() {
        alert('');  
    }
</script>
于 2012-06-10T13:05:18.153 に答える
8

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

これは次のものに匹敵します。

<script>
document.getElementById("hello") //null because the html parser hasn't met the div yet.
</script>
<div id="hello"></div>
于 2012-06-10T13:05:41.670 に答える