详解javascript 变量提升(Hoisting)


Posted in Javascript onMarch 12, 2019

简介

“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。

实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。

声明变量的方法

var、let、const

不用以上关键字直接赋值的变量会挂载与windows环境下;

let a=9
const a=1
var a=6
c=5

声明函数的方法

javascript中声明函数的方法有两种:函数声明式和函数表达式。

//函数声明
function say(){
  console.log('hello') 
}

//函数表达式
var say=function (){
  console.log('hello') 
}

提升的好处

JavaScript 在执行任何代码段之前,将函数声明放入内存中的优点之一是,这允许你可以在在声明该函数之前使用一个函数。

/*** 正确的方式:先声明函数,再调用函数 (最佳实践)*/
function catName(name) {
  console.log("我的猫名叫 " + name);
}
catName("Tigger");
/*以上代码的执行结果是: "我的猫名叫 Tigger"*/


/*** 不推荐的方式:先调用函数,再声明函数 */
catName("Chloe");
function catName(name) {
  console.log("我的猫名叫 " + name);
}
/*代码执行的结果是: "我的猫名叫 Chloe"*/

提升规则

  • var 声明的变量,提升时只声明,不赋值,默认为undefined;不用关键字直接赋值的变量不存在提升(demo1)
  • 函数提升会连带函数体一起提升,不执行;(deom2)
  • 预解析的顺序是从上到下;(demo4)
  • 函数的优先级高于变量,函数声明提前到当前作用域最顶端;(deom3)
  • 变量重名,提升时不会重复定义;在执行阶段后面赋值的会覆盖上面的赋值;(demo4)
  • 函数重名,提升时后面的会覆盖前面;(demo5)
  • 函数和变量重名,提升函数,不会重复定义,变量不会覆盖函数;在执行阶段后面赋值的会覆盖上面的赋值;(demo8)
  • 用函数表达式声明函数,会按照声明变量规则进行提升;(deom6)
  • 函数执行时,函数内部的变量声明和函数声明也按照以上规则进行提升;(deom7)
  • let、const不存在提升;(demo9、demo10)
/**demo1**/
console.log('a=',a) //a=undefined
console.log('b=',b) // Uncaught ReferenceError: b is not defined
var a=1
b=6


/**deom2**/
console.log('a=',a) // a=function a() {console.log("func a()")}
function a() {
console.log("func a()")
}

/**deom3**/
console.log('a=',a) // a=function a() {console.log("fun a")}
var a=3
var a=4

function a(){
console.log("fun a")
}
var a=5
var a=6
console.log("a=",a) // a=6

 

/**deom4**/
console.log('a=',a) // a=undefined
var a =2
console.log('a=',a) //
var a =3
var a =4
console.log('a=',a) // a=4
console.log('b=',b) //b= undefined
var b='b1'


/**deom5**/
console.log('a=',a) // a=function a() {console.log("a2")}
function a(){
console.log("a1")
}
function a(){
console.log("a2")
}
console.log('a=',a) // a=function a() {console.log("a2")}


/**deom6**/
console.log('a=',a) // a=undefined
var a=function(){console.log('a1')}
var a=3
var a=4
var a=5
console.log(a)
var a=function(){console.log('a2')}
console.log('a=',a) // a= ƒ (){console.log('a2')}


/**deom7**/
console.log('b=',b)
var a=3
function b(i){
  console.log('a=',a)
  var a=4
  function a(){
    console.log('fun a')
  }
  console.log('a=',a)
}
b()


/**demo8**/
console.log('a=',a) //a= function a(){ console.log('fun a')}
var a=2
function a(){
  console.log('fun a')
}
console.log('a=',a) // a=2
var a=3
var a=4
var a=5
console.log('a=',a) // a=5


/**demo9**/
console.log('a=',a) //Uncaught ReferenceError: a is not defined
let a=4


/****/
<!--demo10-->
console.log('b=',b) // Uncaught ReferenceError: b is not defined
const b=5

参考资料

MDN

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
什么是cookie?js手动创建和存储cookie
May 27 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
javascript cookie基础应用之记录用户名的方法
Sep 20 Javascript
node.js实现登录注册页面
Apr 08 Javascript
backbone简介_动力节点Java学院整理
Jul 14 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 07 Javascript
layer弹出层自适应高度,垂直水平居中的实现
Sep 16 Javascript
JavaScript setTimeout()基本用法有哪些
Nov 04 Javascript
JavaScript ES 模块的使用
Nov 12 Javascript
Promise静态四兄弟实现示例详解
Jul 07 Javascript
NestJs 静态目录配置详解
Mar 12 #Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 #Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 #Javascript
记录一次完整的react hooks实践
Mar 11 #Javascript
es6数值的扩展方法
Mar 11 #Javascript
Vue实现一个图片懒加载插件
Mar 11 #Javascript
使用Jenkins部署React项目的方法步骤
Mar 11 #Javascript
You might like
yii2实现根据时间搜索的方法
2016/05/25 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
js自定义回调函数
2015/12/13 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Python对象的属性访问过程详解
2020/03/05 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
师范毕业生自荐信
2013/10/17 职场文书
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
会议邀请函范文
2014/01/09 职场文书
事业单位请假制度
2014/01/13 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
交通文明倡议书
2014/05/16 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
民政局个人整改措施
2014/09/24 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Python爬取某拍短视频
2021/06/11 Python