详解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 相关文章推荐
[原创]用javascript实现检测指定目录是否存在的方法
Jan 12 Javascript
Array的push与unshift方法性能比较分析
Mar 05 Javascript
JsDom 编程小结
Aug 09 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
Sep 13 Javascript
javascript类型系统——undefined和null全面了解
Jul 13 Javascript
Vue.js每天必学之组件与组件间的通信
Sep 08 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
Vue.js轮播图走马灯代码实例(全)
May 08 Javascript
JS实现简单tab选项卡切换
Oct 25 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
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
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
PHP微信红包API接口
2015/12/05 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
vue组件学习教程
2017/09/09 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
python缩进区别分析
2014/02/15 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
python实现的希尔排序算法实例
2015/07/01 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
linux安装python修改默认python版本方法
2019/03/31 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
法制宣传日活动总结
2014/04/29 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2014年科技工作总结
2014/11/26 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android