全局作用域和函数作用域问题

来源:16-2 作用域和闭包-执行上下文-代码演示

啦啦儿

2019-02-18

关于作用域的问题。 js中只有2个作用域:函数作用域和全局作用域。
我的理解:

  1. 情况1
    执行前把a的声明拿到全局作用域中赋值undefined。所以console.log(a)就是undefined
  2. 情况2
    同1.
  3. 情况3
    先扫描一遍整个html文件,a的声明拿出来,然后执行,赋值‘nanannaa’,所以console.log(a)就是nanannaa。

然而情况1和情况2的结果并不相同。 情况1是报错,而情况2为undefined。

  </body>
  // 情况1
  <script type="text/javascript">
    console.log(a);
  </script>
  <script>
    var a ="nanannaa"
  </script>

// 情况2
  <script>
    console.log(a);
    var a ="nanannaa"
  </script>

//情况3
  <script>
    var a ="nanannaa"
  </script>
  <script type="text/javascript">
    console.log(a);
  </script>

</html>

写回答

1回答

双越

2019-02-18

“情况1:执行前把a的声明拿到全局作用域中赋值undefined。所以console.log(a)就是undefined”—— 这是错误的。

看你代码,情况1 拿到第一个 script 并解析执行的时候 ,a 在已知代码中没有定义。而情况2 拿到第一个 script 解析并执行的时候,a 已经在已知代码中定义了。

1
2
啦啦儿
因为js是按块执行的,所以情况1执行时没有定义。 虽然js按块执行,但所有的块都只有一个全局作用域。
2019-02-18
共2条回复

BAT大牛带你横扫初级前端JavaScript面试(第二版)

BAT高级前端工程师亲授,结合真实面试题,提高面试成功几率

4268 学习 · 817 问题

查看课程