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打开word文档的实现代码(c#)
Apr 16 Javascript
Jquery 例外被抛出且未被接住原因介绍
Sep 04 Javascript
jquery 实现返回顶部功能
Nov 17 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
vue绑定class与行间样式style详解
Aug 16 Javascript
利用Three.js如何实现阴影效果实例代码
Sep 26 Javascript
VUE长按事件需求详解
Oct 18 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
JavaScript原型继承和原型链原理详解
Feb 04 Javascript
JavaScript函数重载操作实例浅析
May 02 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
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
夜大毕业生自我鉴定
2013/10/31 职场文书
答谢会策划方案
2014/05/12 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
唐山大地震的观后感
2015/06/05 职场文书
导游词之襄阳古城
2019/09/27 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技