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文件传参数(详解)
Jul 13 Javascript
JavaScript中原型和原型链详解
Feb 11 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 Javascript
vue组件实现进度条效果
Jun 06 Javascript
js中时间格式化的几种方法
Jul 22 Javascript
JS+php后台实现文件上传功能详解
Mar 02 Javascript
解决Vue打包上线之后部分CSS不生效的问题
Nov 12 Javascript
Vue——前端生成二维码的示例
Dec 19 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
基于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
杏林同学录(八)
2006/10/09 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
jQuery 选择器理解
2010/03/16 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
详解jQuery选择器
2016/12/21 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
MySQL最常见的操作语句小结
2015/05/07 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
Python中一行和多行import模块问题
2018/04/01 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python实现录音小程序
2020/10/26 Python
python实现三次样条插值
2018/12/17 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Notino法国:购买香水和化妆品
2019/04/15 全球购物
判断单链表中是否存在环
2012/07/16 面试题
4s客服专员岗位职责
2013/12/01 职场文书
师德学习感言
2014/01/31 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
校友会致辞
2015/07/30 职场文书
python游戏开发Pygame框架
2022/04/22 Python