详谈js的变量提升以及使用方法


Posted in Javascript onOctober 06, 2018

介绍

变量提升Hoisting是人们对JavaScript执行上下文工作方式的一种认识,并不是官方给出的改变

从字面上理解,变量提升的意思是变量和函数的声明会在物理层移动到作用域的最前面。但是这样理解并不准确,效果是相同的,但是实际的实现方式是JavaScript的变量和函数的声明会在编译阶段放入内存

这意味着使用者在正式声明一个函数或者变量之前就能够使用它

函数的提升

在JavaScript中,在声明一个函数前,我们就能够使用它,大家应该都体验过,像这样:

test();

 

function test() {

  // do something

}

在正常的使用情况下,应该需要先声明函数才能调用,但是这种方法仍然能够运行,这是因为JavaScript自动将函数声明事先存入了内存的原因,看起来就像JavaScript自动把函数声明提升到了最前面

变量的提升

对于变量,JavaScript使用类似的方法,但是要注意一点的是,对于变量的提升,JavaScript只会将变量声明提升,但是不会把初始化提升,如果在变量初始化之前使用,则会得到undefined

// undefined

console.log(a);

// ReferenceError: b is not defined

console.log(b);

var a = 10;
// undefined

console.log(num);

num = 6;

// 6

console.log(num);

num += 7;

// 13

console.log(num);

var num;
// undefined

console.log(num);

num = 1;

// 1

console.log(num);

var num = 2;

// 2

console.log(num);

这里要注意,JavaScript的变量提升是针对var的,而let和const不存在变量提升这一特性

// ReferenceError: a is not defined

console.log(a);

let a = 10;

一个复杂一点的例子

var a = 100;

function fn() {

  // undefined

  console.log(a);

  var a = 200;

  // 200

  console.log(a);

}

fn();

// 100

console.log(a);

var a;

// 100

console.log(a);

// 300

var a = 300;

console.log(a);
Javascript 相关文章推荐
用于自动添加Digg This!按钮的JavaScript
Dec 23 Javascript
Prototype使用指南之selector.js说明
Oct 26 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
Dec 07 Javascript
js自执行函数的几种不同写法的比较
Aug 16 Javascript
微信jssdk用法汇总
Jul 16 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
浅析js中mvvm模式实现的原理
Oct 06 #Javascript
js for终止循环 跳出多层循环
Oct 04 #Javascript
iView-admin 动态路由问题的解决方法
Oct 03 #Javascript
Angular resolve基础用法详解
Oct 03 #Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 #Javascript
angular.js实现列表orderby排序的方法
Oct 02 #Javascript
Angularjs实现数组随机排序的方法
Oct 02 #Javascript
You might like
php 文件上传类代码
2011/08/06 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
详解Python中的正则表达式的用法
2015/04/09 Python
Python Requests安装与简单运用
2016/04/07 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
美的官方商城:Midea
2016/09/14 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
智能钱包:Ekster
2019/11/21 全球购物
毕业生的自我评价分享
2013/12/18 职场文书
十八大感想感言
2014/02/10 职场文书
职务说明书范文
2014/05/07 职场文书
办理信用卡工作证明
2014/09/30 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL