详解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与asp.net(c#)互相调用方法
Dec 13 Javascript
jquery UI 1.72 之datepicker
Dec 29 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
Js四则运算函数代码
Jul 21 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
jQuery中prop()方法用法实例
Jan 05 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
chrome调试javascript详解
Oct 21 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
JavaScript ES6的新特性使用新方法定义Class
Jun 28 Javascript
javascript笔记之匿名函数和闭包
Feb 06 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 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抓取页面与代码解析 推荐
2010/07/23 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
matplotlib绘制动画代码示例
2018/01/02 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
护理人员的自我评价分享
2014/03/15 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
运动会主持词大全
2015/07/02 职场文书
mybatis 获取更新记录的id
2022/05/20 Java/Android