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编辑器和代码格式化
Apr 25 Javascript
JQuery的Validation插件中Remote验证的中文问题
Jul 26 Javascript
JavaScript实用技巧(一)
Aug 16 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
js实现自动轮换选项卡
Jan 13 Javascript
微信小程序中input标签详解及简单实例
May 18 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 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中使用Oracle数据库(3)
2006/10/09 PHP
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
jQuery分组选择器简单用法示例
2019/04/04 jQuery
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Django实现表单验证
2018/09/08 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Django如何将URL映射到视图
2019/07/29 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
什么是规则表达式
2012/05/03 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
公司授权委托书样本
2014/09/15 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
优秀员工演讲稿
2019/06/21 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL