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