详解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 相关文章推荐
document.all与WEB标准
May 13 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
浅析jQuery中常用的元素查找方法总结
Jul 04 Javascript
Javascript浅谈之引用类型
Dec 18 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
vue router下的html5 history在iis服务器上的设置方法
Oct 18 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
Jan 16 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
3分钟读懂移动端rem使用方法(推荐)
May 06 Javascript
vue表单数据交互提交演示教程
Nov 13 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 Javascript
Vue实现多页签组件
Jan 14 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
简单采集了yahoo的一些数据
2007/02/14 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
python数据封装json格式数据
2018/03/04 Python
python基础 range的用法解析
2019/08/23 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
财务管理专业推荐信
2013/11/19 职场文书
干部行政关系介绍信
2014/01/17 职场文书
体育教学随笔感言
2014/02/24 职场文书
环境保护标语
2014/06/20 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
安全守法证明
2015/06/23 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript