详谈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 相关文章推荐
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
May 15 Javascript
gridpanel动态加载数据的实例代码
Jul 18 Javascript
jquery鼠标停止移动事件
Dec 21 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
Apr 11 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
Mar 20 Javascript
js实现密码强度检验
Jan 15 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
javascript实现摄像头拍照预览
Sep 30 Javascript
微信小程序封装多张图片上传api代码实例
Dec 30 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 zip扩展Linux下安装过程分享
2014/05/05 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
vue实现点击按钮下载文件功能
2019/10/11 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Python request使用方法及问题总结
2020/04/26 Python
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
我的兄弟姐妹观后感
2015/06/15 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS