变量提升和作用域

709 阅读2分钟

let和const不存在变量提升

想用let和const声明的变量,必须在声明的下方使用,在上边会有暂时性死区的错误

var let const三者有什么区别?

var可以重复声明 let和const不可以

var存在变量提升 let和const没有

var声明的变量会在window下增加一个对应的属性,let和const不会

var不识别块级作用域 let和const可以

     function f(){
        console.log(a)//undefined
        var a = 12;
        console.log(a)//12
    }
    f();

作用域

作用域就是代码能起作用的区域,是一块栈内存,分为全局作用域和私有作用域

全局作用域

页面一打开就会形成一个全局作用域,一个页面只有一个全局作用域,全局作用域声明的变量我们称为全局变量

私有作用域

在函数执行的时候会形成一个私有的作用域,私有作用域声明的变量我们称为私有变量,形参也是私有变量

块级作用域

指的是判断句、循环句的大括号包起来的部分,是es6新增的,只有let和const声明的变量可以识别块级作用域,对于var不存在块级作用域一说

上级作用域

函数执行时形成的那个私有作用域,一般都会有一个上级作用域,私有作用域的上级作用域是谁,跟这个函数在哪里执行没有关系,只跟这个函数在哪里定义的有关系

私有作用域的变量,有可能不是这个作用域的私有变量,这时,该变量对应的值,就要去上级作用域中查找

如果仍然不是上级作用域的私有变量,则接着向上级查找,一直到window全局,如果还没有就会报错,上述查找变量的机制,我们称为作用域链

函数执行的时候 先有形参赋值 再有变量提升!!