之前写代码时常常没有注意这个声明提前,今天有时间就理顺一下声明提前,虽然不常用,但是理顺有助理解别人的代码。
声明提前:
1.变量声明提前
(1) 使用var关键字声明的变量会在所有代码执行之前,被声明,但是未赋值
console.log('a:',a); var a = 10; console.log('b:',b); b = 20; console.log(b); console.log(window.b); console.log(window);
如上图结果是a的值为undefined, b未定义,变量a的写法等同于下面的写法,
var a console.log('a:',a); a = 10;
(2) 没有使用变量关键字声明的变量等同于直接将值赋给window对象,如:b = 20等同于window.b = 20
当注释console.log('b:',b),结果如下图
console.log('a:',a); var a = 10; //console.log('b:',b); b = 20; console.log(b); console.log(window.b); console.log(window);
b的值被保存到window对象上了,调用b和window.b的值是一样的。
2.函数声明提前
(1) 使用函数声明形式( function 函数名(){} )创建的函数,会在所有代码执行之前被创建
fn(); function fn(){ console.log('使用函数声明形式'); } fn2(); var fn2 = function(){ console.log('使用var等关键字,函数表达式'); }
(2) 使用var等关键字,函数表达式创建的函数,同变量声明提前相似,先声明,但是未赋,结果见上图
fn2函数的写法等同于下面的代码
var fn2; fn2(); fn2 = function(){ console.log('使用var等关键字,函数表达式'); }