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同时提交多个Web表单的方法
Dec 26 Javascript
js字母大小写转换实现方法总结
Nov 13 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
Dec 25 Javascript
JavaScript弹出对话框的三种方式
Mar 23 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
angular route中使用resolve在uglify压缩后问题解决
Sep 21 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
Jan 25 Javascript
vue实现通讯录功能
Jul 14 Javascript
vue+element实现表单校验功能
May 20 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 addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
python 生成图形验证码的方法示例
2018/11/11 Python
python程序封装为win32服务的方法
2021/03/07 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
Python3.9新特性详解
2020/10/10 Python
写好自荐信的技巧
2013/11/08 职场文书
单位单身证明范本
2014/01/11 职场文书
师生聚会感言
2014/01/26 职场文书
室内趣味活动方案
2014/08/24 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
土地租赁协议书
2015/01/29 职场文书
费城故事观后感
2015/06/10 职场文书
HTML通过表单实现酒店筛选功能
2021/05/18 HTML / CSS
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android