JavaScript的变量声明提升问题浅析(Hoisting)


Posted in Javascript onNovember 30, 2016

一、变量声明提升

      hoisting 英[‘hɔɪstɪŋ] 美[‘hɔɪstɪŋ]

      n. 起重,提升

      v. 把…吊起,升起( hoist的现在分词 )

先来看一个栗子

var cc = 'hello';
function foo(){
 console.log(cc);
 var cc = 'world';
 console.log(cc);
}
foo();
console.log(cc);

这里将会输出 undefined'world' 'hello'

此处主要有两个知识点:

      1、作用域

      2、变量声明提升

JavaScript是一门解释性语言,当代码在解释器(如Chrome的V8引擎)环境中执行时,会有一个预解析的过程,此时会将变量声明和函数声明提升至当前作用域的最前方,这个行为被称为声明提升(Hoisting)

再来看上面的例子,此代码有两层作用域,全局作用域和函数foo作用域,而foo中的变量声明在预解析的过程中会被提升至函数作用域的前方,于是代码就会变成这样:

var cc = 'hello';
function foo(){
 var cc;
 console.log(cc);
 cc = 'world';
 console.log(cc);
}
foo();
console.log(cc);

当执行到第一个log时,变量cc只是进行了声明,并未赋值,所以打印出的是undefined

二、 函数声明提升

函数的声明有两种方式:函数声明和函数表达式

// 函数声明
function foo(a, b) {
 return a + b;
}
// 函数表达式
var foo = function(a, b) {
 return a + b;
}

解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

当然,也可以函数声明和函数表达式同时使用,如var a = function b(){} ,其结果是只具有函数表达式的作用,b会被自动忽略,所以只会发生变量提升效果。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript数字和字符串转换示例
Mar 26 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
JavaScript中对JSON对象的基本操作示例
May 21 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
JS针对Array的各种操作汇总
Nov 29 Javascript
将JSON字符串转换成Map对象的方法
Nov 30 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
使用Angular CLI生成路由的方法
Mar 24 Javascript
Node.js创建HTTP文件服务器的使用示例
May 11 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
封装一下vue中的axios示例代码详解
Feb 16 Javascript
VSCode launch.json配置详细教程
Jun 18 Javascript
浅析script标签中的defer与async属性
Nov 30 #Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 #Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 #Javascript
html判断当前页面是否在iframe中的实例
Nov 30 #Javascript
vue.js实现表格合并示例代码
Nov 30 #Javascript
浅谈jquery的html方法里包含特殊字符的处理
Nov 30 #Javascript
Javascript 闭包详解及实例代码
Nov 30 #Javascript
You might like
php获取域名的google收录示例
2014/03/24 PHP
浅谈PHP中的
2016/04/23 PHP
多种方法实现JS动态添加事件
2013/11/01 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python抓取最新博客内容并生成Rss
2015/05/17 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python使用turtle绘制分形树
2018/06/22 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python3数字求和的实例
2019/02/19 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
PHP中如何使用Cookie
2015/10/28 面试题
外科实习自我鉴定
2013/10/06 职场文书
大专毕业生简历的自我评价
2013/10/20 职场文书
五一手机促销方案
2014/03/08 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
Django中celery的使用项目实例
2022/07/07 Python
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技