详谈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 相关文章推荐
JS URL传中文参数引发的乱码问题
Sep 02 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
Dec 08 Javascript
javascript中的replace函数(带注释demo)
Jan 07 Javascript
node.js博客项目开发手记
Mar 16 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
默认浏览器设置及vue自动打开页面的方法
Sep 21 Javascript
vue路由中前进后退的一些事儿
May 18 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 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在字符串中查找另一个字符串
2008/11/19 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
详解React项目中碰到的IE问题
2019/03/14 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
Python绘制热力图示例
2019/09/27 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
python实现AdaBoost算法的示例
2020/10/03 Python
python中实现词云图的示例
2020/12/19 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
土木工程师岗位职责
2013/11/24 职场文书
应付会计岗位职责
2013/12/12 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
公司总经理岗位职责
2014/03/15 职场文书
商场主管竞聘书
2014/03/31 职场文书
电气自动化求职信
2014/06/24 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
文艺演出主持词
2015/07/01 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
python tkinter实现定时关机
2021/04/21 Python
Python数据分析入门之数据读取与存储
2021/05/13 Python