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 相关文章推荐
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
May 30 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
教你5分钟学会用requirejs(必看篇)
Jul 25 Javascript
JS改变页面颜色源码分享
Feb 24 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
在vue-cli创建的项目中使用sass操作
Aug 10 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
js前端设计模式优化50%表单校验代码示例
Jun 21 Javascript
JS实现简单的九宫格抽奖
Jun 28 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
新电JAVA笔试题目
2014/08/31 面试题
校领导推荐信
2013/11/01 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
公司离职证明标准范本
2014/10/05 职场文书
化工见习报告范文
2014/10/31 职场文书
2014年班主任工作总结
2014/11/08 职场文书
500字小学生检讨书
2015/02/19 职场文书
党支部工作总结2015
2015/04/01 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书