<script type="text/javascript">
function func(){
}
var foo="foo";
</script>
<script type="text/javascript">
var foo="foo";
function func(){
}
</script>
一开始,当func是一个函数而foo是“未定义的”,但我想知道哪个是第一个被定义的,func还是foo?
答案 0 :(得分:3)
进入执行上下文时,变量和函数声明(以及功能代码的形式参数)的标识符都是在代码执行之前实现的。< / p>
对于变量,正如您所指出的那样,它们在该阶段使用 undefined 值进行初始化,当控制到达赋值表达式时,赋值发生在,例如:
var foo = "outer";
(function () {
alert(foo); // undefined
var foo = "inner";
})();
在上面的代码中,我们可以看到foo
标识符如何保存undefined
值,这是因为在进入函数执行上下文时,本地foo
变量已初始化。
这就是为什么人们建议在函数顶部声明变量(类似于实际发生的事情)的原因之一
函数声明也是 hoisted ,你可以在声明之前实际使用它们,因为我们知道它是在代码执行之前制作的,例如:
func(); // "bar"
function func () {
return "bar";
}
另见:
答案 1 :(得分:1)
在
var foo = "foo";
function func() {
}
正在进行两件事
foo
和func
同时宣布。
func
的初始化被提升到顶部。所以函数在var
之前初始化。
所以操作顺序是
foo
和func
已宣布func
已初始化为Function
对象foo
已初始化为"foo"
这在代码中是最清楚的
var foo = bar;
function bar() {}
此代码运行后typeof foo === 'function'
。
答案 2 :(得分:0)
我相信标识符会被定义为遇到声明。
答案 3 :(得分:0)
javascript中的函数总是首先被解析和定义。
<script type="text/javascript">
alert('before func: ' + func); // Print function as string
alert('before somevar: ' + somevar); // Print undefined
function func() {
}
var somevar = "hello";
alert('after func: ' + func); // Print function as string
alert('after somevar: ' + somevar); // Print hello
</script>