JavaScript中变量提升与函数提升经典实例分析


Posted in Javascript onJuly 26, 2018

本文实例讲述了JavaScript中变量提升与函数提升。分享给大家供大家参考,具体如下:

从两个实例说起:

eg1:

var i;
console.log(i); // 2

eg2:

console.log(i); // undefined
var i = 2;

1、提升

变量和函数声明从它们在代码中出现的位置被提升到了最上面。

注意:

只有声明本身会被提升,而赋值操作不会被提升。

变量会提升到其所在函数的最上面,而不是整个程序的最上面。

函数声明会被提升,但函数表达式不会被提升:

func1(); // Uncaught TypeError: func1 is not a function
func2(); // Uncaught ReferenceError: func2 is not defined
var func1 = function func2() { ... };

JavaScript中的ReferenceErrorTypeError

① ReferenceError:引用错误。JavaScript引擎查询变量时,若在作用域里没有找到该变量,JavaScript引擎就会抛出一个ReferenceError。

② TypeError:类型错误。当在作用域中找到了某变量引用,然后让该变量去做力所不能及的事情时,如引用它一个不存在的属性,或将非函数的变量用作函数引用,JavaScript引擎就会抛出一个TypeError。

2、函数优先

函数声明和变量声明都会被提升,但是需要注意的是函数会先被提升,然后才是变量。

func(); // 1
var func;
function func() {
  console.log(1);
}
func = function() {
  console.log(2);
}

运行结果:输出1而不是2

理由:var func;尽管出现在function func()之前,但它是重复的声明,会被忽略,因为函数声明会被提升到普通变量之前。上述代码等价于:

function func() {
  console.log(1);
}
func(); // 1
func = function() {
  console.log(2);
}

尽管重复的声明会被忽略掉,但出现在后面的函数声明还是可以覆盖前面的:

func(); // 3
function func() {
  console.log(1);
}
func = function() {
  console.log(2);
}
function func() {
  console.log(3);
}

一个普通块内部的函数声明通常会被提升到其所在作用域的顶部,提升过程不会被条件判断所控制:

func(); // 2
var flag = true;
if (flag)
  function func() { console.log(1); }
else
  function func() { console.log(2); }

注意:尽量避免在块内声明函数,在JavaScript未来的版本中上述行为可能会发生改变。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js采用map取到id集合组并且实现点击一行选中一行
Dec 16 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
浅析Javascript中“==”与“===”的区别
Dec 23 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
Aug 31 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
Javascript操作表单实例讲解(下)
Jun 20 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
详解vue.js 开发环境搭建最简单攻略
Jun 12 Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 jQuery
使用vue实现简单键盘的示例(支持移动端和pc端)
Dec 25 Javascript
基于vue-cli3和element实现登陆页面
Nov 13 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 #Javascript
详解ECMAScript typeof用法
Jul 25 #Javascript
微信小程序动态生成二维码的实现代码
Jul 25 #Javascript
JavaScript设计模式之装饰者模式定义与应用示例
Jul 25 #Javascript
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 #Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 #Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 #Javascript
You might like
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
PHP7多线程搭建教程
2017/04/21 PHP
js导航菜单(自写)简单大方
2013/03/28 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
python自定义异常实例详解
2017/07/11 Python
django中的setting最佳配置小结
2017/11/21 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
护理职业生涯规划书
2014/01/24 职场文书
保密普查工作实施方案
2014/02/25 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
个人政治思想总结
2015/03/05 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python