当前位置: 首页 > news >正文

变量提升知识总结

文章目录

  • 前言
  • 实例
    • 词法作用域
    • let,const的提升
    • var的提升
    • 函数的提升


前言

提升是指解释器在执行代码之前,似乎将函数、变量的声明移动到其作用域的顶部的过程。
此文介绍其中的
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的提升

如下俩种情况

//情况1let a=1function loga(){console.log(a);}loga()会输出1
//情况2
let a=1function 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);//undefinedvar a=1console.log(a);//1

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

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

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

函数的提升

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

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

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

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

以及外泄

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

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


http://www.dtcms.com/a/286560.html

相关文章:

  • 前后端数据交互,关于表单数据传输问题
  • 图机器学习(11)——链接预测
  • Linux和git常用命令
  • TF-IDF(Term Frequency - Inverse Document Frequency)
  • RFID技术赋能智慧物流:实现搬运环节的精准化与高效化
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • 【LeetCode 2163. 删除元素后和的最小差值】解析
  • 上市公司-企业超额商誉数据(2005-2023年)-实证数据
  • 《C++继承深度引擎:从内存布局到多态全景拆解》​
  • 飞算科技:以创新科技引领数字化变革,旗下飞算 JavaAI 成开发利器
  • Linux Master 知识库 —— 致 Linux 系统工程师
  • 通信算法之294:LTE系统中的整数倍频偏估计
  • 太阳辐射监测站:洞察太阳能量的科技之眼
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 告别宕机!Ubuntu自动重启定时任务设置(一键脚本/手动操作)
  • [Raspberry Pi]如何將無頭虛擬顯示器服務(headless display)建置在樹莓派的Ubuntu桌面作業系統中?
  • 汽车免拆诊断案例 | 07款丰田Hilux启动故障
  • Redis——MoreKey
  • 深入理解进程地址空间:虚拟内存与进程独立性
  • nodeJs笔记(六)
  • Ubuntu系统下交叉编译Android的X265库
  • 【leetcode】3202. 找出有效子序列的最大长度(2)
  • 联合利华发起TRO维权行动,OUAI商标或引发跨境圈大批量冻结
  • 密码学基础概念详解:从古典加密到现代密码体系
  • 函数指针和指针函数
  • 【非辐射复合】半导体中非辐射载流子复合的双能级机制
  • 储能BMS通信“卡壳”?CAN转EtherCAT让电池数据“跑起来”
  • animation-timing-function动画的速度曲线
  • 面试150 被围绕的区域
  • 数据结构——单调栈