详谈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 相关文章推荐
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
编写可维护面向对象的JavaScript代码[翻译]
Feb 12 Javascript
wap浏览自动跳转到wap页面的js代码
May 17 Javascript
jQuery知识点整理
Jan 30 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
Nov 25 Javascript
一道面试题引发的对javascript类型转换的思考
Mar 06 Javascript
微信小程序 动态传参实例详解
Apr 27 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
VuePress 快速踩坑小结
Feb 14 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
Apr 17 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
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
对js关键字命名的疑问介绍
2014/04/25 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
Python函数参数类型*、**的区别
2015/04/11 Python
python结合API实现即时天气信息
2016/01/19 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
利用nohup来开启python文件的方法
2019/01/14 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
linux安装python修改默认python版本方法
2019/03/31 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Django中提示消息messages的设置方式
2019/11/15 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
编辑找工作求职信范文
2013/12/16 职场文书
冬季安全检查方案
2014/05/23 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
Python类方法总结讲解
2021/07/26 Python