hookex
3/16/2020 - 4:48 AM

JS作用域

{
  console.log(a); // undefined
  var a;
  console.log(a); // undefined
  a = 1;
  console.log(a); // 1
  var a;
  console.log(a); // 1
}

{
  function a() {
    console.log('2', a); // a(){}
    a = 1;
    console.log('3', a); // 1
  }
  console.log('1', a); // a(){}
  a();
  console.log('4', a); // 1
  a(); // error, not a function
}

/**
 * 注意case1,2,3的异同
 */
 
// case: 1
{
  var a = 1;
  // 函数表达式后面的函数名是可选的
  // 如果有函数名,函数名是函数体的本地变量, 且赋值无效
  (function a() { 
    console.log('1', a); // a(){}
    a = 2; 
    console.log('2', a); // a(){}
  })();
  console.log('3', a); // 1
}

// case: 2
{
  var a = 1;
  
  {
    var func;
    
    // 函数表达式后面的函数名是可选的
    // 如果有函数名,函数名是函数体的本地变量, 且赋值无效
    func = function a() {
      console.log('1', a); // a(){}
      a = 2;
      console.log('2', a); // a(){}
    }
  
    func();
    console.log('3', a); // 1;  
  }
  console.log('4', a); // 1
}

// case: 3
{
  var a = 1;
  
  {
    // 块级作用域中的函数声明类似var
    function a() {
      console.log('1', a); // a(){}
      a = 2;
      console.log('2', a); // 2
    }
    
    var func = a;
    
    func();
  }
  console.log('3', a); // a(){}
}