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 相关文章推荐
Jquery中增加参数与Json转换代码
Nov 20 Javascript
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
简易js代码实现计算器操作
Apr 15 Javascript
js解析json读取List中的实体对象示例
Mar 11 Javascript
ExtJs动态生成treepanel的Json格式
Jul 19 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
Sep 12 Javascript
详解浏览器渲染页面过程
Feb 09 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
解决vue项目中type=”file“ change事件只执行一次的问题
May 16 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 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中的phpinfo()函数
2013/06/06 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
script标签属性用type还是language
2015/01/21 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python闭包实现计数器的方法
2015/05/05 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
python实现用户名密码校验
2020/03/18 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
应届生财务管理求职信
2013/11/06 职场文书
cf战队收人口号
2014/06/21 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
利用python做表格数据处理
2021/04/13 Python
Python如何导出导入所有依赖包详解
2021/06/08 Python
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
Vue+Flask实现图片传输功能
2022/04/01 Vue.js