详谈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中的相等与不等运算
Apr 25 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
Jul 04 Javascript
一段非常简单的js判断浏览器的内核
Aug 17 Javascript
jQuery对象的length属性用法实例
Dec 27 Javascript
js实现ifram取父窗口URL地址的方法
Feb 09 Javascript
JavaScript对数组进行随机重排的方法
Jul 22 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
解析Json字符串的三种方法日常常用
May 02 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
Sep 19 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
如何通过JS实现日历简单算法
Oct 14 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 fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python中的默认参数详解
2015/06/24 Python
python 爬取微信文章
2016/01/30 Python
微信跳一跳python代码实现
2018/01/05 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
积极分子思想汇报
2014/01/04 职场文书
校园绿化美化方案
2014/06/08 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
党性修养心得体会2016
2016/01/21 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP