详谈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 相关文章推荐
在JavaScript中使用inline函数的问题
Mar 08 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
浅谈JavaScript function函数种类
Dec 29 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
鼠标经过出现气泡框的简单实例
Mar 17 Javascript
vue实现简单跑马灯效果
May 25 Javascript
React forwardRef的使用方法及注意点
Jun 13 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
PHP5 安装方法
2007/01/15 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
React Native验证码倒计时工具类分享
2017/10/24 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
Django如何自定义分页
2018/09/25 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
python编写计算器功能
2019/10/25 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
2014年高三毕业生自我评价
2014/01/11 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
焦裕禄观后感
2015/06/03 职场文书
《鲸》教学反思
2016/02/23 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android