JavaScript中声明的执行顺序是什么? 函数func(){ } var foo=“foo”; var foo=“foo”; 函数func(){ }

JavaScript中声明的执行顺序是什么? 函数func(){ } var foo=“foo”; var foo=“foo”; 函数func(){ },javascript,Javascript,一开始,当func是一个函数,foo是“未定义的”,但我想知道哪一个是第一个被定义的,func或foo?我认为标识符是在遇到声明时定义的。我认为标识符是在遇到声明时定义的。javascript中的函数总是首先解析和定义的 <script type="text/javascript"> function func(){ } var foo="foo"; </script> <script type="text/java

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

我认为标识符是在遇到声明时定义的。

我认为标识符是在遇到声明时定义的。

javascript中的函数总是首先解析和定义的

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

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

警报('before func:'+func);//将函数打印为字符串
警报('somevar:'+somevar之前);//打印未定义
函数func(){
}
var somevar=“你好”;
警报('func:'+func之后);//将函数打印为字符串
警报('somevar:'+somevar之后);//打印你好

javascript中的函数总是首先解析和定义

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

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

警报('before func:'+func);//将函数打印为字符串
警报('somevar:'+somevar之前);//打印未定义
函数func(){
}
var somevar=“你好”;
警报('func:'+func之后);//将函数打印为字符串
警报('somevar:'+somevar之后);//打印你好

变量和函数声明的标识符(以及函数代码的形式参数)在进入执行上下文时生成,实际上是在代码执行之前

在变量的情况下,正如您所注意到的,它们在该阶段用未定义的值初始化,赋值在控件到达赋值表达式后发生,例如:

<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>
在上面的代码中,我们可以看到
foo
标识符如何保存
undefined
值,这是因为当进入函数执行上下文时,本地
foo
变量被初始化

这就是为什么人们建议在函数顶部声明变量的原因之一(类似于实际发生的情况)

函数声明也被挂起,您实际上可以在声明之前使用它们,因为我们知道,它是在代码执行之前进行的,例如:

var foo = "outer";
(function () {
  alert(foo); // undefined
  var foo = "inner";
})();
另见:

  • 过程

变量和函数声明的标识符(以及函数代码的形式参数)在进入执行上下文时生成,实际上是在代码执行之前

在变量的情况下,正如您所注意到的,它们在该阶段用未定义的值初始化,赋值在控件到达赋值表达式后发生,例如:

<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>
在上面的代码中,我们可以看到
foo
标识符如何保存
undefined
值,这是因为当进入函数执行上下文时,本地
foo
变量被初始化

这就是为什么人们建议在函数顶部声明变量的原因之一(类似于实际发生的情况)

函数声明也被挂起,您实际上可以在声明之前使用它们,因为我们知道,它是在代码执行之前进行的,例如:

var foo = "outer";
(function () {
  alert(foo); // undefined
  var foo = "inner";
})();
另见:

  • 过程
    • func(); // "bar"
      function func () {
        return "bar";
      }
      
      有两件事正在发生

    • 声明
    • 初始化
    • foo
      func
      同时声明

      func
      的初始化被提升到顶部。因此函数在
      var
      s之前初始化

      所以操作的顺序是

    • foo
      func
      已声明
    • func
      初始化为
      函数
      对象
    • foo
      初始化为
      “foo”
    • 这在代码中是最清晰的

      var foo = "foo";
      function func() {
      }
      
      其中,在该代码运行之后,在

      有两件事正在发生

    • 声明
    • 初始化
    • foo
      func
      同时声明

      func
      的初始化被提升到顶部。因此函数在
      var
      s之前初始化

      所以操作的顺序是

    • foo
      func
      已声明
    • func
      初始化为
      函数
      对象
    • foo
      初始化为
      “foo”
    • 这在代码中是最清晰的

      var foo = "foo";
      function func() {
      }
      

      其中,在该代码运行之后,
      typeof foo===“function”

      不正确。声明在执行第一条语句之前生效。为了证明,考虑<代码>警报(FO);变量foo=1。这不会因为定义了foo而导致异常失败,但也不会因为foo尚未初始化而向1发出警报。不正确。声明在执行第一条语句之前生效。为了证明,考虑<代码>警报(FO);变量foo=1。这不会因为定义了foo而导致异常失败,但也不会因为foo尚未初始化而向1发出警报。