从未遇到过这个问题,也不知道为什么。 唯一的解释是范围问题。
在同一页面中,我有两个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的范围?
帮忙?
答案 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)
这是一个明显错误的另一个原因是,如果第一个脚本块有语法错误并且完全被拒绝,但第二个块运行并错过了其伙伴代码。