详谈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.boxy插件的iframe扩展代码
Jul 02 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
Json对象与Json字符串互转(4种转换方式)
Mar 27 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
Nov 18 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
通用无限极下拉菜单的实现代码
May 31 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
JavaScript复制内容到剪贴板的两种常用方法
Feb 27 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
node实现简单的增删改查接口实例代码
Aug 22 Javascript
vue在线动态切换主题色方案
Mar 26 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
php5.2.0内存管理改进
2007/01/22 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
python从入门到精通(DAY 3)
2015/12/20 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
python实现学员管理系统
2019/02/26 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
python中实现词云图的示例
2020/12/19 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
迎新晚会策划方案
2014/06/13 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle