变量提升知识总结

发布于:2025-07-20 ⋅ 阅读:(22) ⋅ 点赞:(0)


前言

提升是指解释器在执行代码之前,似乎将函数、变量的声明移动到其作用域的顶部的过程。
此文介绍其中的
1. 能够在声明变量之前在其作用域中使用该变量的值(函数的提升)
2. 能够在声明变量之前在其作用域中引用该变量而不报错,但值始终是 undefined(var提升)
3.变量的声明导致在声明行之前的作用域中发生变化。(let,const的提升)

实例

词法作用域

先介绍js的词法作用域的性质,也就是在定义时,就确定了变量的作用域

  let value = 'global';

function foo() {
  console.log(value);
}

function bar() {
  let value = 'local';
  foo();
}

bar(); // 在词法作用域下输出: "global",//定义时就确定了作用域
       // 如果是动态作用域则会输出: "local"

如上有一个全局变量value
一个输出value的函数foo
以及一个内部含value与foo的函数bar
由于词法作用域,在foo定义时其中无value,那么就会去父级 也就是全局中得到‘global’
无论在哪调用始终如此,比如在bar中有value,但定义时bar并不是foo的父级,故不会访问bar的value

let,const的提升

如下俩种情况

//情况1
 let a=1
 function loga(){
     console.log(a);
 }
 loga()会输出1
//情况2
let a=1
 function loga(){
    
     console.log(a);
     let a=2;
 }
 loga()//此时就报错了,因为在编译时确定了loga中存在a变量,所以就不会去全局作用域中找a了,

情况1容易理解,loga向父级寻找到a=1
情况2则不同了,而会报错,这是因为
在编译时loga函数就确定了存在a这个变量(某种意义上的提升),故在其执行时不会向父级寻找,而let(const)并不会提升声明,即在声明之前未定义
也就是在作用域头至声明前使用其会出错也就是暂时性死区
故而会产生错误,const同理

var的提升

 console.log(a);//undefined
    var a=1
    console.log(a);//1

如上var 会将声明提升至作用域最前等价于

var a
console.log(a);//undefined
     a=1
    console.log(a);//1

即a先声明未赋值为undefined,后赋值为1

函数的提升

函数则是讲声明与定义域总体提前,也就是函数总是在最前面
但要注意的是函数表达式的情况

  1. 双重提升
f()//f访问成功
function f(){//或者let
    console.log('f访问成功');
}

等价于

function f(){//或者let
    console.log('f访问成功');
}
f()//f访问成功
  1. 函数表达式
    这种类型是由于被赋为函数的变量本质还是由let const var生命的
    报错是f为声明
 f()//报错
const f=function(){//或者let
    console.log('f访问成功');
    
}
f()//f访问成功

报错是因为在const f之前 为f暂死区,f无法访问,也就访问不到f函数f() let同理
var的函数表达式
var只会提前声明也就等价于
报错是f不是函数

var f
f()//报错   
 f=function(){//或者let
    console.log('f访问成功');
    
}
f()//f访问成功

以及外泄

function fn() {
  foo = 123;   //→ window.foo = 123
}
fn();
console.log(window.foo); // 123

函数中使用未声明的值会提升至全局



网站公告

今日签到

点亮在社区的每一天
去签到