详谈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显示时间 js显示最后修改时间
Jan 02 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
微信小程序 location API实例详解
Oct 02 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
JavaScript深入V8引擎以及编写优化代码的5个技巧
Jun 24 Javascript
JS实现横向轮播图(中级版)
Jan 18 Javascript
js 数组 fill() 填充方法
Nov 02 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合并两个数组的两种方式的异同
2012/09/14 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
php curl_init函数用法
2014/01/31 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php的debug相关函数用法示例
2016/07/11 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
init进程的作用
2012/04/12 面试题
国税会议欢迎词
2014/01/16 职场文书
养牛场项目建议书
2014/05/13 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android