一、块级作用域

块级作用域(亦被称为词法作用域)存在于: 1、 函数内部

2、 块中(字符{和}之间的区域)

  • 允许在块级作用域内声明函数

  • 函数声明(函数名称) 类似于 var,即会提升到全局作用域或函数作用域的头部

  • 同时,函数声明(函数整体) 还会提升到所在的块级作用域的头部

二、块级作用域内的默认变量

  1. console.log(b);
  2. {
  3. console.log(b);
  4. b = 50;
  5. console.log(b);
  6. }
  7. console.log(b);
  • 在块级作用域内部声明的默认变量(不适用let,var,const修饰),只有等到执行过你定义那个变量的那行代码后才可以访问,才给window赋值这个属性,在那行代码之前访问会报错;
  • 块内的 默认变量依旧是全局变量
  • 在块内的默认变量没执行之前不可以访问这个变量

三、块级作用域内的函数声明

  • 块内的函数声明会提升到块内的顶部,同时也会在全局作用域用var声明一个同名的变量,初始值为undefined
  • 这个块外的全局同名变量的赋值时机是执行完块内那行函数声明语句后才赋值
  • 块内的函数声明会提升到块内顶部,区别提升到块外,它并不会用var去声明一个同名的变量
  1. // 块级作用域(亦被称为词法作用域)存在于:
  2. // 1、 函数内部
  3. // 2、 块中(字符{和}之间的区域)
  4. // 允许在块级作用域内声明函数
  5. // 函数声明(函数名称) 类似于 var,即会提升到全局作用域或函数作用域的头部
  6. // 同时,函数声明(函数整体) 还会提升到所在的块级作用域的头部
  7. // 例1
  8. function fn() {
  9. // 块级作用域中的函数声明(fn2())被提升到函数作用域的顶端
  10. console.log("" + fn2);
  11. // 全局作用域中的函数fn();
  12. console.log("" + fn);
  13. function fn2() {
  14. console.log("fn2是块级作用域中声明的函数" + " : " + fn2);
  15. }
  16. fn2();
  17. }
  18. fn();
  19. console.log(fn);
  20. // 例2
  21. console.log(fn);
  22. if (1 == 1) {
  23. console.log(fn);
  24. function fn() {
  25. console.log("ok");
  26. }
  27. }
  28. console.log(fn);