JavaScript代码在执行前会将所有的声明移动到各自作用域的最顶端,这个过程叫做提升。

1. 需要记住的几条规则:

  • 函数声明优先提升,然后才是变量声明。

  • 重复的变量声明会被忽略。

  • 重复的函数声明,后面的声明会覆盖前面的声明。

  • let 和 const 声明的变量存在暂时性死区(temporal dead zone,简称 TDZ)

    使用let或const命令声明变量之前,该变量都是不可用的。

2. 例子:

  • 变量声明提升
console.log(bar)   // undefined
var bar = 1
console.log(bar)  // 1/*提升后*/var bar
console.log(bar)
bar = 1
复制代码
  • 函数声明提升
foo()   // fuck oriented object
function foo() {console.log('fuck oriented object')
}/*提升后*/function foo() {console.log('fuck oriented object')
}
foo()
复制代码
  • 函数表达式提升
foo()   // 报错 : foo is not a function
var foo = function () {console.log('fuck oriented object')
}/*提升后*/var foo
foo()
foo = function () {console.log('fuck oriented object')
}
复制代码
  • 函数声明优先
foo()   // fuck oriented object
var foo = 1
function foo() {console.log('fuck oriented object')
}
console.log(foo)  // 1/*提升后*/
function foo() {console.log('fuck oriented object')
}
var foo
foo()
foo = 1
复制代码
  • 重复的变量声明会被忽略
foo()  // 2
var foo
function foo() {console.log(1)
}
foo = function () {console.log(2)
}/*提升后*/function foo() {console.log(1)
}
foo()
foo = function () {console.log(2)
}
复制代码
  • 重复的函数声明,后面会覆盖前面的
fn()  // 2
function fn() {console.log(1)
}
function fn() {console.log(2)
}
复制代码
  • let 和 const 命令声明的变量存在暂时性死区
console.log(bar)   //  报错 bar is not defined
const bar = 1
复制代码
console.log(foo)  // 报错 foo is not defined
let foo = 2
复制代码

至于let和const声明的变量存不存在提升推荐看下这篇文章: 我用了两个月的时间才理解 let

转载于:https://juejin.im/post/5b90d202f265da0ab5035918

JavaScript学习笔记 - 提升相关推荐

  1. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

    JavaScript:学习笔记(7)--VAR.LET.CONST三种变量声明的区别 ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用 ...

  2. JavaScript学习笔记(三)---事件、正则表达式、ES6、运动

    JavaScript学习笔记(三)---事件.正则表达式.ES6.运动 27.insertbefore 28.滚动条及事件 29.事件及事件对象 30.鼠标事件对象的属性 31.案例:图片随鼠标移动 ...

  3. JavaScript学习笔记(一)-Learning Advanced JavaScript

    JavaScript学习笔记 (一)- Learning Advanced JavaScript Learning Advanced JavaScript #2: Goal: To be able t ...

  4. JavaScript学习笔记一

    JavaScript学习笔记 1. 介绍 2. 基础语法 输入输出 变量 数据类型 简单数据类型 复杂数据类型 类型转换 3. 运算 算术运算符 递增递减运算符 比较运算符 逻辑运算符 赋值运算符 运 ...

  5. 千锋JavaScript学习笔记

    千锋JavaScript学习笔记 文章目录 千锋JavaScript学习笔记 写在前面 1. JS基础 1.1 变量 1.2 数据类型 1.3 数据类型转换 1.4 运算符 1.5 条件 1.6 循环 ...

  6. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  8. JavaScript学习笔记(五)

    JavaScript学习笔记(五) ①Array类 本地对象 ②Date类 ①Global对象 对象的类型   内置对象 ②Math对象 宿主对象 今天继续学习JS中的对象,昨天内置对象Global对 ...

  9. JavaScript学习笔记(备忘录)

    JavaScript学习笔记(备忘录) ===运算符 判断数值和类型是否相等.如: console.log('s'==='s') //输出trueconsole.log('1'===1) //输出fa ...

  10. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

最新文章

  1. YOLO-v5训练自己的数据+TensorRT推理部署(2)
  2. day 05 python基础
  3. 使用SQLyog无法连接到MySQL,error code 2013
  4. eclipse报错:Failed to load the JNI shared library
  5. 24、HTML 属性
  6. mysql 图形插件_对我来说数据库图形化管理工具用这个足够了
  7. Java学习笔记--继承和多态(下)
  8. linux mxnet 编译,MXnet安装和编译
  9. P3085,jzoj3234-[USACO13OPEN]阴和阳【点分治】
  10. 从“挖光缆”到“剪网线”|蚂蚁金服异地多活的微服务体系
  11. 精通php7,PHP 7从入门到精通
  12. 子文件夹的权限统一于E盘的权限
  13. Asp.net中模仿Winform的MessageBox
  14. 怎样将Win10自带的Photos查看器的背景色改成白色?
  15. NCIE(国家网络工程师认证)
  16. 推荐几款非常好用且免费的在线绘图工具
  17. 评估模型都有哪些_培训效果评估的5个模型
  18. Debug: defusedxml, CV_LOAD_IMAGE_UNCHANGED,CV_IMWRITE_JPEG_QUALITY,undistortPoints
  19. 判断apk是否加固或混淆,Python + dex2jar-2.0实现方法
  20. Echarts字体和线条颜色设置操作笔记

热门文章

  1. 《梦断代码》阅读笔记之第0章和第1章
  2. 记一次复杂的正则匹配——匹配但不包含
  3. 在页面中直接设计TreeView的节点而不使用Web.Sitemap文件在运行时出错信息
  4. cvCloneImage()内存泄漏解决方法, cvCloneImage()和cvCopy()的区别
  5. 【Prison Break】第七天(4.3)
  6. Python利用Beautiful Soup抓取新闻标题
  7. 【LeetCode】【字符串】题号:*434. 字符串中的单词数
  8. C++排序算法——归并排序
  9. ENVI:There are no available ROls or EVFs associated with this input file.
  10. EXCEL 绘制斜线表头