详解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 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
js弹出确认是否删除对话框
Mar 27 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
JavaScript学习笔记之创建对象
Mar 25 Javascript
javascript原型继承工作原理和实例详解
Apr 07 Javascript
微信小程序中做用户登录与登录态维护的实现详解
May 17 Javascript
你有必要知道的10个JavaScript难点
Jul 25 Javascript
微信小程序模板和模块化用法实例分析
Nov 28 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 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/04 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
python列出目录下指定文件与子目录的方法
2015/07/03 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
Python enumerate内置库用法解析
2020/02/24 Python
python遍历路径破解表单的示例
2020/11/21 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
优秀教师主要事迹
2014/02/01 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
法人身份证明书
2015/06/18 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript