JavaScript中声明的执行顺序是什么?

时间:2011-02-14 05:53:02

标签: javascript

<script type="text/javascript">
        function func(){
        }
        var foo="foo";
</script>

<script type="text/javascript">
        var foo="foo";
        function func(){
        }
</script>

一开始,当func是一个函数而foo是“未定义的”,但我想知道哪个是第一个被定义的,func还是foo?

4 个答案:

答案 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() {
}

正在进行两件事

  1. 声明
  2. 初始化
  3. foofunc同时宣布。

    func的初始化被提升到顶部。所以函数在var之前初始化。

    所以操作顺序是

    1. foofunc已宣布
    2. func已初始化为Function对象
    3. foo已初始化为"foo"
    4. 这在代码中是最清楚的

      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>