详谈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限制文本框为整数和货币的函数代码
Oct 13 Javascript
基于jQuery的倒计时插件代码
May 07 Javascript
javascript动态创建链接的方法
May 13 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
Apr 26 jQuery
elementUI 设置input的只读或禁用的方法
Oct 30 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
微信小程序实现Swiper轮播图效果
Nov 22 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
Feb 07 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
Mar 12 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中使用Oracle数据库(6)
2006/10/09 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
详解A标签中href=""的几种用法
2017/08/20 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
python性能测试工具locust的使用
2020/12/28 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
采购部长岗位职责
2014/06/13 职场文书
食品工程专业求职信
2014/06/15 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
教师自查自纠材料
2014/10/14 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
大四学生个人总结
2015/02/15 职场文书
感恩老师主题班会
2015/08/12 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
Python Matplotlib绘制动画的代码详解
2022/05/30 Python