先有蛋(声明),后有鸡(赋值)
/*一*/
a = 2;
var a;
console.log(a) // 2
//实际情况
var a; // 代表代码 执行前 编译 过程中的 变量声明
a = 2;// 代表 代码执行时的 赋值声明
console.log(a) // 2
/* 二 */
console.log(a) // undefined
var a = 2;
//实际情况
var a;// 编译过程 变量提升
console.log(a)
a = 2; // 执行过程 的代码,原地等候
变量声明
属于 编译 过程,赋值声明
属于 执行 过程,编译 在 执行 前。
foo();
function foo(){
console.log( a ); // undefined
var a = 2;
}
// 实际情况
function foo(){
var a;
console.log( a );
a = 2;
}
foo()
变量提升 只会提升至 当前作用域,而不会提升至最外层(全局作用域)
函数优先
foo(); // 1
var foo;
function foo() {
console.log( 1 );
}
foo = function(){
console.log( 2 );
}
// 实际情况
function foo (){
console.log( 1 );
}
var foo;
foo(); // 1
foo = function(){
console.log( 2 );
}
foo函数声明
比foo变量声明
早
// 同类提升会被覆盖
foo(); // 3
function foo() {
console.log( 1 );
}
function foo() {
console.log( 2 );
}
function foo() {
console.log( 3 );
}
后面的函数声明 会覆盖掉 前面的函数声明