我不太确定<script>标签之间发生了什么.例如,以下内容在Chrome中提供了参考错误和类型错误:
<html>
<head>
<script type="text/javascript">
T.prototype.test = function() {
document.write("a");
}
</script>
<script type="text/javascript">
function T() {}
var v = new T();
v.test();
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但这有效:
<html>
<head>
<script type="text/javascript">
</script>
<script type="text/javascript">
T.prototype.test = function() {
document.write("a");
}
function T() {}
var v = new T();
v.test();
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Esa*_*ija 15
上面的脚本在第一个例子中首先执行,所以它还不知道T,因此错误.
在第二个示例中,只要脚本标记被执行,T就可以很好地定义并且在任何地方都可以知道.这是由于函数声明被提升到顶部,无论顺序如何,它们始终可用.功能声明吊装在这里有更深入的解释
应用吊装后的第二个示例:
var v,
T = function(){}; /* using comma like this is short-hand for: var v; var T = function(){}; */
T.prototype.test = function() {
document.write("a");
};
v = new T();
v.test();
Run Code Online (Sandbox Code Playgroud)
它们每个都在全局上下文中解析,但是按顺序.在考虑第二个脚本标记之前,将解析并执行整个第一个脚本标记.作为解析脚本的一部分,函数声明会提前识别,这就是为什么第二个工作原理而第一个工作原理不工作的原因.