以下是有效的javascript代码:
<script>
foo();
function foo()
{
alert("foo");
}
</script>
函数foo在声明之前被调用。所以,我认为浏览器必须在执行之前加载整个块脚本。通过“整个块”,我的意思是对open标签或外部javascript文件的开放标记。这是真的吗?
答案 0 :(得分:2)
Function statements受吊装的约束。这意味着无论声明函数的位置如何,它都会移动到定义函数的作用域的顶部。
(function () {
foo();
function foo() {
alert('foo is beign called');
}
}());
在编译时,该代码的结构将更改为:
(function () {
function foo() {
alert('foo is beign called');
}
foo();
}());
函数语句不是唯一需要提升的函数,因为var
语句也是如此(并且因为JavaScript只有函数作用域),建议顶部只有one var statement一个函数,例如:
var bar = "baz"; // on the outer scope
(function () {
alert(bar); // bar is undefined
var bar = "other value";
}());
警报显示undefined
,因为内部代码更改为:
var bar = "baz";
(function () {
var bar;
alert(bar); // bar is undefined
bar = "other value";
}());
答案 1 :(得分:1)
如果方法或变量未定义,则抛出错误“undefined”,但如果声明但未赋值,那么js不会抛出任何错误。
<script>
foo();
function foo()
{
alert("foo");
}
</script>
但是你的代码不会抛出任何异常,你也可以轻松调试你的javascript代码。这是一个很好的视频,展示了如何调试js代码:Debugging with Firebug
答案 2 :(得分:0)
当我将JS粘贴到Firebug中时,我得到“foo未定义”。
JS的大多数实现将加载整个文件,然后执行它。文件中的语句按顺序执行,因此函数foo的调用发生在定义之前,这是ECMA 262标准第8.7节所要求的错误。 1