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

这不是范围问题。如果您在一个脚本元素中定义了一个函数(在全局范围内),那么您可以在另一个脚本元素中使用它。

但是,脚本元素在遇到时会被解析和执行。

提升不适用于脚本元素。在较早的脚本元素的初始运行期间,稍后脚本元素中定义的函数将不可用。

您要么需要交换脚本元素的顺序,要么将函数调用延迟到定义它的脚本运行之后(例如,通过将其附加到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 回答
2

作为明显错误的另一个原因是如果第一个脚本块有语法错误并被全部拒绝,但第二个块继续运行并错过了它的伙伴代码。

于 2015-08-15T02:03:24.773 回答