变量提升:在当前上下文中(全局、私有、块级),JS代码自上而下会提前处理一些事情
(可以理解为词法解析的一个环节,词法解析一定发生在代码执行之前)
会把当前上下文中用 var/function 关键字创建的变量进行提前声明或者定义
var a =10;
声明: var a;
定义: a =10
用 var 创建的会提前声明
用 function 创建的会提前声明加定义
*//*
* 代码执行之前:全局上下文中的变量提升(变量)
var a; 默认值的 undefined
*/
console.log(a);// a已经被提前声明了,但是没有定义 =>undefinedvar a =12;// 创建值12,不需要在声明a了(变量提升阶段完成了,完成的事情不会重新处理) a = 12 进行赋值
a =13;// 创建值13 赋值给a
console.log(a);// 13 */*代码执行之前:全局上下文中的变量提升(函数)
fn = 函数 函数在变量提升阶段会进行声明加定义
*/fn();// 'OK'functionfn(){
console.log('OK');}fun();// 变量提升阶段只定义,没有声明,所以 fun 是undefined// =>报错 Uncaught TypeError: fun is not a functionvarfun=function(){// 真实项目中建议用函数表达式创建函数,因为这样在变量提升阶段只会声明fun,并不会进行定义,所以没办法在函数定时之前进行调用
console.log('OK');}fun();// 'OK'varfun=functionAA(){// 把原本作为值的函数表达式的匿名函数“具名化”(就是给函数取了一个名字-- AA)// 具名化的函数名属于私有变量,只能在该执行上下文中只用
console.log(AA);// =>输出当前函数
console.log(fun ===AA);// => ture// AA(); // 可以实现递归调用(注意避免死递归)}AA();// 报错:AA is not definedfun();
console.log(a);//报错:a is not defined 因为不是用 var/function声明的,所以不会发生变量提升
a =13;
console.log('OK');// => 'OK'
console.log(a);// 报错 Cannot access 'a' before initialization 不能在创建变量a之前引用let a =13;*/