详谈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获取当前网址、主机地址项目根路径
Nov 19 Javascript
Jquery遍历Json数据的方法
Apr 20 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
Nov 23 Javascript
jQuery实现布局高宽自适应的简单实例
May 28 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
Feb 21 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
Jun 15 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
vue组件开发props验证的实现
Feb 12 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
Sep 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
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP实现微信退款功能
2018/10/02 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
清空上传控件input file的值
2010/07/03 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
如何通过Python实现标签云算法
2019/07/02 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
python自动发微信监控报警
2019/09/06 Python
python实现udp聊天窗口
2020/03/31 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
数控加工专业毕业生自荐信
2013/09/27 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
检讨书大全
2015/01/27 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书