JavaScript程序由语句和函数声明组成。执行JavaScript程序时,将发生以下两个步骤:
将扫描代码以查找函数声明以及每个函数。声明是“执行的”(通过创建函数对象),并且创建了对该函数的命名引用(以便可以在语句中调用此函数)
语句按顺序执行(求值)(如代码中所示)
因此,这可以正常工作:
<script>
foo();
function foo() {
return;
}
</script>
尽管“ foo”函数在声明之前被调用,但是它起作用,因为该函数声明是在语句之前求值的。
但是,这不起作用:
<script>
foo();
</script>
<script>
function foo() {
return;
}
</script>
将引发ReferenceError(“未定义foo”)。得出这样的结论:网页HTML代码中的每个SCRIPT元素都代表一个单独的JavaScript程序,并且每当HTML解析器遇到SCRIPT元素时,它都会在该元素中执行该程序(然后执行该程序,解析器将转到SCRIPT元素后面的HTML代码)。
再一次,这确实可行:
<script>
function foo() {
return;
}
</script>
<script>
foo();
</script>
我在这里的理解是,全局对象(在全局执行上下文中用作变量对象)一直存在(并保持),因此第一个JavaScript程序将创建函数对象并为其进行引用,然后第二个JavaScript程序将使用该引用来调用该函数。因此,所有JavaScript程序(在单个网页内)“使用”相同的Global对象,并且随后运行的所有JavaScript程序都可以观察到一个JavaScript程序对Global对象所做的所有更改。
现在,请注意...
<script>
// assuming that foo is not defined
foo();
alert(1);
</script>
在上述情况下,警报调用将不会执行,因为“ foo()”语句会引发ReferenceError(这会破坏整个JavaScript程序),因此,所有后续语句均不会执行。
但是,在这种情况下...
<script>
// assuming that foo is not defined
foo();
</script>
<script>
alert(1);
</script>
现在,警报调用确实已执行。第一个JavaScript程序引发ReferenceError(并因此而中断),但是第二个JavaScript程序正常运行。当然,浏览器将报告错误(尽管在发生错误后,它确实执行了后续的JavaScript程序)。
现在,我的结论是:
- 网页的HTML代码中的每个SCRIPT元素都代表一个单独的JavaScript程序。这些程序在HTML解析器遇到它们时立即执行。
- 同一网页中的所有JavaScript程序都“使用”相同的Global对象。该全局对象始终存在(从抓取网页的那一刻直到网页被破坏)。JavaScript程序可以操纵Global对象,并且可以在所有后续JavaScript程序中观察到一个JavaScript程序对Global对象所做的所有更改。
- 如果一个JavaScript程序中断(抛出错误),则不会阻止后续的JavaScript程序执行。
请事实检查这篇文章,并告诉我是否有错。
另外,我还没有找到解释这篇文章中提到的行为的资源,并且我认为浏览器制造商必须在某处发布了这些资源,因此,如果您了解这些资源,请提供指向它们的链接。