let 、const 、var、function声明关键字的新理解
所谓的const、let不存在变量提升只是仅限于表面,但实际上还是会进行预处理。
创建提升
const a = 2 if(true) { console.log(a) // Uncaught ReferenceError: Cannot access 'a' before initialization const a = 1 }
在这段代码中如果if里的a创建不提升,则打印的是a=2,全局变量的2
但这里报的无法在初始化之前访问a错误,所以const虽说是不提升但还是被预处理了
可以这么理解
所谓的创建提升就是把const a 这条语句先进行预处理,给他留一个执行的坑,但实际上const a并没有被执行,a并没有被初始化
第一人称来看:第四行代码告诉编译器 ,我是const a,我要先给在if这个块头部占个坑,我将在console.log(a)的之后进行初始化,你不能先去找其他的狗子(其他的a),你要等我,但是console.log(a)等不及了,你要让我输出你,但是又不给我值,我要找编译器评理了,然后就丢出错误 ReferenceError: Cannot access ‘a’ before initialization
所以我们常说const、 let 推荐在块作用域的最顶部进行使用,可以避免这种事情发生
初始化提升
var 、function 存在初始化提升
原本的初始化,就是语句在那里出现,则在哪里进行初始化,而var function 关键字则存在初始化提升,会自动提升到顶部进行函数声明,也就是我们常说的变量提升
赋值提升
赋值提升只有function关键字存在
通过下面例子可以很清楚的了解到赋值提升
1 abc() 2 3 function abc(){ 4 console.log('I am abc') 5 }
这里的abc()函数调用是可以成功的,因为函数声明和函数体赋值都被提升到了开头,相当于
function abc(){ console.log('I am abc') } abc()
这些都是很基础的变量提升,唯一的新知识就是创建提升
总结!划重点
var 的[创建] 和[初始化]都被提升了
function的 [创建] [初始化] [赋值] 都被提升了