变量提升的表现是,无论在函数中何处位置声明的变量,好像都被提升到了函数的首部,可以在变量声明前访问到而不会报错。简单来说就是通过解析和预编译为代码的函数变量创建上下文环境,使得变量在生命前就可以访问。

那为什么会进行变量提升呢?主要有以下两个原因:

  • 提高性能
  • 容错性更好

总结:

  • 解析和预编译过程中的声明提升可以提高性能,让函数可以在执行时预先为变量分配栈空间
  • 声明提升还可以提高JS代码的容错性,使一些不规范的代码也可以正常执行

    造成变量声明提升的本质原因

造成变量声明提升的本质原因是 js 引擎在代码执行前有一个解析的过程,创建了执行上下文,初始化了一些代码执行时需要用到的对象。当访问一个变量时,会到当前执行上下文中的作用域链中去查找,而作用域链的首端指向的是当前执行上下文的变量对象,这个变量对象是执行上下文的一个属性,它包含了函数的形参、所有的函数和变量声明,这个对象的是在代码解析的时候创建的。

首先要知道,JS在拿到一个变量或者一个函数的时候,会有两步操作,即解析和执行。

  • 在解析阶段,JS会检查语法,并对函数进行预编译。解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。

    • 全局上下文:变量定义,函数声明
    • 函数上下文:变量定义,函数声明,this,arguments
  • 在执行阶段,就是按照代码的顺序依次执行。

JavaScript的变量提升相关推荐

  1. JavaScript中变量提升是什么?如何实现?

    在进行web前端开发的时候,我们经常会遇到变量提升的情况,那么JS在解析变量的时候是如何做到提升的呢?今天小千就来带大家了解一下. 首先在JS中涉及两种作用域的问题,那么什么是作用域呢? 作用域是代码 ...

  2. JavaScript:变量提升作用域

    作用域是JavaScript中听上去感觉很简单,其实比较麻烦的一个特性,什么是作用域?我看书籍有一个相对的官方解释:作用域(scope,或译有效范围)就是变量和函数的可访问范围,即作用域控制着变量和函 ...

  3. JavaScript之变量提升

    1.什么是变量提升(Hoisting)? Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识,在ES6之前是找不到变量提升这个词的 "变量提升"意味着变量 ...

  4. JavaScript hoisting(变量提升)学习总结

    定义:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部. JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明. 例如一下两个例子: 例1: ...

  5. javaScript变量提升以及函数提升

    变量的声明赋值 var a = 1; 上面的代码先声明变量 a,然后在变量 a 与数值 1 之间建立引用关系,称为将数值 1 "赋值"给变量 a.以后,引用变量名 a 就会得到数值 ...

  6. JavaScript 笔记(2) -- 类型转换 正则表达 变量提升 表单验证

    目录:  typeof, null, undefined, valueOf() 类型转换 正则表达式 错误: try, catch, throw 调试工具 变量提升 strict 严格模式 使用误区 ...

  7. JavaScript中的预解析(变量提升)介绍!

    今天小千为大家介绍一下JavaScript中的预解析(变量提升).从什么是预解析及变量的预解析和函数的预解析及加载流程进行学习(注意:我们这里说的ES5中的预解析). 什么是解析 首先代码执行肯定需要 ...

  8. 关于JavaScript的变量和函数提升

    第一种理解方式:let和const不能被使用,直到他们被声明 对于var定义的变量,解析器会提升其到作用域顶部. // Outputs: undefined console.log(x);var x ...

  9. JavaScript中函数的变量提升问题

    函数的大体分三种,一种是函数的声明,一种是函数表达式(又称为函数的字面量) 1.函数的声明 => function myFn(){}; 2.函数的表达式 => var myFn = fun ...

最新文章

  1. 2022-2028年中国XPS挤塑板行业市场全景评估及产业前景规划报告
  2. 安装mysql查看随机密码命令_linux安装mysql-8.0.21-1.el7.x86_64.rpm-bundle - 君主-bye
  3. RAID信息存放位置!
  4. [转载]Token原理以及应用
  5. Spring Cloud源码分析(四)Zuul:核心过滤器
  6. 系统调用功能模块的初始化
  7. 老子《道德经》第三章
  8. 【码云】git简单使用总结
  9. oracle迁移数据到mysql
  10. Linux:管线命令
  11. CCF201903-2 二十四点游戏(JAVA版)
  12. java计算机毕业设计医院各科室财务管理2021源码+系统+mysql数据库+lw文档
  13. 给初学者:用VB写外挂 ———— 实战一:动手写一个红色警戒金钱锁定工具
  14. e900v21e 装第三方_创维e900v21e刷机包
  15. 谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks
  16. 盘古开源解析:物联网时代的芯片产业新趋势
  17. php异位或加密,PHP异位或加密实现自动登陆
  18. 多种乡村体验游盈利方式,助你撬动上千亿乡村旅游市场!
  19. 善用三个舆论引导策略,让你的危机公关活动事半功倍
  20. BOGNER博格纳正式宣布杨洋为品牌代言人

热门文章

  1. 相对路径和绝对路径区别
  2. 中国虾青素市场趋势报告、技术动态创新及市场预测
  3. Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?
  4. 青岛计算机操作员初级考试时间,青岛市2021年初级会计考试时间公布了吗?
  5. 测试女朋友是好是坏的软件,脱单测试题女生版最准测试
  6. js原型和原型链的理解(透彻)
  7. 字符串和二进制串相互转换(C++)
  8. 游戏《侠盗飞车3:罪恶城市》功能码
  9. Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
  10. Tornado基础知识