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 document.images实例
May 27 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
Sep 08 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
Oct 23 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
May 04 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
Oct 01 Javascript
AngularJS中实现动画效果的方法
Jul 28 Javascript
angular.JS实现网页禁用调试、复制和剪切
Mar 31 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
原生js实现分页效果
Sep 23 Javascript
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
浅析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中路径问题的解决方案
2006/10/09 PHP
PHP和XSS跨站攻击的防范
2007/04/17 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php实现的RSS生成类实例
2015/04/23 PHP
php四种定界符详解
2017/02/16 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python之Class&Object用法详解
2019/12/25 Python
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
数学教学随笔感言
2014/02/17 职场文书
法制宣传教育方案
2014/05/09 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
2015个人半年总结范文
2015/03/09 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL