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 相关文章推荐
javascript中关于执行环境的杂谈
Aug 14 Javascript
简单的代码实现jquery定时器
Jan 03 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
快速使用Bootstrap搭建传送带
May 06 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
js实现以最简单的方式将数组元素添加到对象中的方法
Dec 20 Javascript
关于Vue项目跨平台运行问题的解决方法
Sep 18 Javascript
webpack4.0 入门实践教程
Oct 08 Javascript
Vue使用axios出现options请求方法
May 30 Javascript
微信小程序 textarea 层级过高问题简单解决方案
Oct 14 Javascript
JQuery常用简单动画操作方法回顾与总结
Dec 07 jQuery
JavaScript实现网页tab栏效果制作
Nov 20 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
一篇入门的php Class 文章
2007/04/04 PHP
PHP EOT定界符的使用详解
2008/09/30 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
php简单生成随机数的方法
2015/07/30 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP children()函数讲解
2019/02/03 PHP
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python自动发微信监控报警
2019/09/06 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
中文专业自荐书
2014/06/29 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js