javascript通过脚本标签定义范围?

时间:2012-06-10 13:01:50

标签: javascript

从未遇到过这个问题,也不知道为什么。 唯一的解释是范围问题。

在同一页面中,我有两个JS部分:

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

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

这将显示错误: go未定义

其中

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

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

工作(显然)。

<script>标签是否会创建JS的范围? 帮忙?

3 个答案:

答案 0 :(得分:21)

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

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

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

您需要交换脚本元素的顺序,或延迟函数调用,直到定义它的脚本运行(例如将其附加到onload事件处理程序)。

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

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

答案 1 :(得分:7)

在转移到下一个元素之前,html解析器会停止执行您的脚本。所以下一个脚本元素 在第一个执行之前不会执行。

这与:

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

答案 2 :(得分:1)

这是一个明显错误的另一个原因是,如果第一个脚本块有语法错误并且完全被拒绝,但第二个块运行并错过了其伙伴代码。