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 相关文章推荐
动态改变div的z-index属性的简单实例
Aug 08 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
Apr 29 Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
Vuex提升学习篇
Jan 11 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
Mar 22 Javascript
angular第三方包开发整理(小结)
Apr 19 Javascript
深入理解 TypeScript Reflect Metadata
Dec 12 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 04 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 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自动反斜杠的函数代码
2010/01/05 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
php中引用符号(&)的使用详细介绍
2016/12/06 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python机器学习之KNN分类算法
2018/08/29 Python
python实现贪吃蛇小游戏
2020/03/21 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
linux环境下Django的安装配置详解
2019/07/22 Python
python轮询机制控制led实例
2020/05/03 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
几道数据库的面试题或笔试题
2014/05/31 面试题
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
素质教育标语
2014/06/27 职场文书
小学优秀学生评语
2014/12/29 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python
MySQL数据库表约束讲解
2022/06/21 MySQL
TypeScript 内置高级类型编程示例
2022/09/23 Javascript