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代码
Feb 11 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
jQuery UI制作选项卡(tabs)
Dec 13 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
Aug 16 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
Aug 30 Javascript
vue 清空input标签 中file的值操作
Jul 21 Javascript
在Uni中使用Vue的EventBus总线机制操作
Jul 31 Javascript
Jquery $.map使用方法实例详解
Sep 01 jQuery
微信小程序实现加入购物车滑动轨迹
Nov 18 Javascript
Vue3中toRef与toRefs的区别
Mar 24 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
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
php表单提交实例讲解
2015/11/12 PHP
分享PHP守护进程类
2015/12/30 PHP
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
javascript几个易错点记录
2014/11/26 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
python编写爬虫小程序
2015/05/14 Python
django实现前后台交互实例
2017/08/07 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python交互模式基础知识点学习
2020/06/18 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
如何提高JDBC的性能
2013/04/30 面试题
公益活动邀请函
2014/02/05 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
个人整改方案范文
2014/10/25 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
canvas 中如何实现物体的框选
2022/08/05 Javascript