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脚本性能的优化方法
Feb 02 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
jquery得到iframe src属性值的方法
Sep 25 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
jQuery siblings()用法实例详解
Apr 26 Javascript
详解微信小程序开发之城市选择器 城市切换
Jan 17 Javascript
简单实现js倒计时功能
Feb 13 Javascript
jQuery实现的简单在线计算器功能
May 11 jQuery
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
May 10 Javascript
详解微信UnionID作用
May 15 Javascript
JavaScript实现轮播图效果代码实例
Sep 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
如何过滤高亮显示非法字符
2006/10/09 PHP
php邮件发送的两种方式
2020/04/28 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
js如何实现设计模式中的模板方法
2013/07/23 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
端午节演讲稿
2014/05/23 职场文书
大学生实训报告总结
2014/11/05 职场文书
简历中自我评价范文
2015/03/11 职场文书
财产分割协议书
2016/03/22 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js