SOURCE

console 命令行工具 X clear

                    
>
console
//1
var a = '123';
console.log(a); //123
function a(){}



//2
function b(c){
  console.log(c);//function
  function c(){
    console.log(c)//function
  }
  c();
}
b(10);
//3
function d(e){
  var e = '123';
  console.log(e);//123
  function e(){
    console.log(e)
  }
  e();//TypeError: e is not a function. (In 'e()', 'e' is "123")
}
//d('234');
//4
function e(f){
  console.log('f',f);
  f = function(){ //没有变量提升
    console.log(f);
  }
  f();
}
e();
<ol>
  <li>变量的问题,莫过于声明和赋值两个步骤,而这两个步骤是分开的。</li>
  <li>函数声明被提升时,声明和赋值两个步骤都会被提升,而普通变量却只能提升声明步骤,而不能提升赋值步骤。</li>
<li>变量被提升过后,先对提升上来的所有对象统一执行一遍声明步骤,然后再对变量执行一次赋值步骤。而执行赋值步骤时,会优先执行函数变量的赋值步骤,再执行普通变量的赋值步骤。
当你明白这三点后,一切都豁然开朗了。</li>
</ol>