详解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 Scoping and Hoisting 翻译
Jul 03 Javascript
jquery延迟加载外部js实现代码
Jan 11 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
详解JavaScript中undefined与null的区别
Mar 29 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
微信小程序实现登录注册tab切换效果
Dec 29 Javascript
js数组去重的方法总结
Jan 18 Javascript
微信小程序 下拉刷新及上拉加载原理解析
Nov 06 Javascript
详解Vue项目的打包方式(生成dist文件)
Jan 18 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+xslt在windows平台上
2006/10/09 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
php图片裁剪函数
2018/10/31 PHP
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
python实现趣味图片字符化
2019/04/30 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
一份全面的PHP面试问题考卷
2012/07/15 面试题
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
Java基础面试题
2012/11/02 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
初一学生期末评语
2014/04/24 职场文书
中职生自荐信范文
2014/06/15 职场文书
生产操作工岗位职责
2014/09/16 职场文书
未婚证明范本
2015/06/15 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
小学一年级语文教学反思
2016/03/03 职场文书