详解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 相关文章推荐
js相册效果代码(点击创建即可)
Apr 16 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
Javascript实现单例模式
Jan 24 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
Mar 07 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
May 10 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
taro小程序添加骨架屏的实现代码
Nov 15 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
PHP Curl出现403错误的解决办法
2014/05/29 PHP
Yii学习总结之安装配置
2015/02/22 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
python中from module import * 的一个坑
2014/07/20 Python
Python开发常用的一些开源Package分享
2015/02/14 Python
python 使用get_argument获取url query参数
2017/04/28 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
祖国在我心中演讲稿400字
2014/05/04 职场文书
走群众路线剖析材料
2014/10/09 职场文书
2014年网管工作总结
2014/12/11 职场文书
营销计划书
2015/01/17 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
论文致谢词范文
2015/05/14 职场文书
实习指导老师意见
2015/06/04 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers