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 相关文章推荐
页面右下角弹出提示框示例代码js版
Aug 02 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
JavaScript整除运算函数ceil和floor的区别分析
Apr 14 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
Dec 02 Javascript
详解Bootstrap按钮
Jan 04 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
JS实现随机抽取三人
Nov 06 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 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公用函数列表[正则]
2007/02/22 PHP
php格式化日期实例分析
2014/11/12 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
Python 字典dict使用介绍
2014/11/30 Python
python实现决策树
2017/12/21 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python绘制彩虹图
2019/12/16 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
求职信范文怎么写
2014/01/29 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
个人自荐书范文
2015/03/09 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技