详解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 相关文章推荐
jquery 可排列的表实现代码
Nov 13 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
Aug 10 Javascript
node.js不得不说的12点内容
Jul 14 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
Sep 01 Javascript
学习vue.js表单控件绑定操作
Dec 05 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
Dec 19 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 Javascript
前端vue+express实现文件的上传下载示例
Feb 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数据库抽象层 PDO
2011/05/07 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
详解React 条件渲染
2020/07/08 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python math模块的基本使用教程
2021/01/16 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
营业经理岗位职责
2013/11/10 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
丽江古城导游词
2015/02/03 职场文书
农村老人去世追悼词
2015/06/23 职场文书
Python循环之while无限迭代
2022/04/30 Python