扒一扒JavaScript 预解释


Posted in Javascript onJanuary 28, 2015

带var关键字预解释

让我们先看下这段代码执行的结果:

alert(n);//弹出undefined

var n = 10;

弹出的结果是undefined,为何不是10?让我们再看下面这段代码执行的结果:

alert(n);

n = 10;

运行报如下错误:

扒一扒JavaScript 预解释

为何这次会报错,原因是代码在运行的时候,没有声明这个变量n;通过这两段代码的比较,我们发现带var关键字和不带var关键字声明的变量是有区别的,带var声明的变量在代码执行之前,似乎浏览器已经给了它们一个初始值undefined,因此我们将代码执行前,浏览器引擎自动扫描带var关键字和带function关键字(后面会提到)声明的变量和定义的函数的这个过程称为预解释。

带function关键字预解释

让我们看下如下代码执行的结果:

fn();//弹出hello

function fn(){

    alert('hello');

}

执行结果弹出hello,fn能够正常执行,原因是在代码执行前fn被预解释了,在预解释时已经将fn定义(defined)了,我们又有疑问了,为何第一段代码执行结果不弹出10,而是undefined,再次引入了另一个概念JavaScript中的声明和定义。

JavaScript中的声明(declare)和定义(defined)

我们通常用var关键来声明变量,用function关键字来定义函数,只不过function关键字声明和定义函数是同时执行的,而var它只能声明变量,并不具备定义的功能。

如下是用var关键字声明的变量:

var n;//声明了一个变量n

var m = 10;//声明了一个变量m,并且将10赋值给它

如下是用function关键字定义的函数:

//定义了一个函数fn

function fn(){

    alert('hello');

}

带var关键字和带function关键字预解释的区别

其实它俩的区别就是带var关键字预解释时只预解释声明部分(因为它本身不具备定义的能力),而带function关键字在预解释时声明和定义同时被预解释。这时我们再回头分析下第一段代码,分析如下:

扒一扒JavaScript 预解释

无节操(坑爹)的预解释

为何说它无节操,请看下面的代码(火狐除外):

alert(n);

fn();

if(false) {

    var n = 10;

    function fn(){

        alert('hello');

    }

}

第一行代码执行会弹出undefined,第二行代码执行会弹出hello;是因为n和fn在代码执行前被预解释了,即使if条件判断为false,执着的浏览器引擎也会将带var关键字声明的变量n和带function关键定义的fn扫描到。

*预解释忽略重新声明,不忽略重新定义

这个地方因为相对比较绕而且不太好理解,所以加了一个星号,请看如下代码:

alert(n);

var n = 10;

var n = 9;

var n;

alert(n);

这段代码执行结果是什么,我们来分析一下:

扒一扒JavaScript 预解释

继续上代码,请分析如下执行结果:

fn();

function fn() {

    alert('1');

}

fn();

function fn() {

    alert('2');

}

fn();

代码分析图如下:

扒一扒JavaScript 预解释

带function定义的函数预解释分析

总结:

本篇博文用了大篇幅代码和截图对JavaScript中预解释作了概述,纵观各种书籍对预解释的描述甚少,其实平时在工作中使用的场景也并不多,遗憾的是预解释是各大公司面试题必考。在刚开始接触它的时候,感觉它总是不按照常理写代码,但是有些时候却能够正常运行并不会报错,当然这也增加了我们对它神秘感的探索,也让我们进一步了解浏览器引擎是怎么解释执行我们的代码。特此在后面的博文中我会拿几道经典的案例来综合分析它,再次感谢大家的支持!

Javascript 相关文章推荐
javascript数字数组去重复项的实现代码
Dec 30 Javascript
基于jquery的3d效果实现代码
Mar 23 Javascript
js判断样式className同时增加class或删除class
Jan 30 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
May 14 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 Javascript
js实现列表向上无限滚动
Jan 13 Javascript
js中switch语句的学习笔记
Mar 25 Javascript
vue-cli3单页构建大型项目方案
Apr 07 Javascript
javascript弹出页面回传值的方法
Jan 28 #Javascript
JS获得选取checkbox整行数据的方法
Jan 28 #Javascript
js获取checkbox值的方法
Jan 28 #Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 #Javascript
浅谈javascript的调试
Jan 28 #Javascript
js的for in循环和java里foreach循环的区别分析
Jan 28 #Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 #Javascript
You might like
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
PHP实现简单日历类编写
2020/08/28 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
Python画图高斯分布的示例
2019/07/10 Python
Python之多进程与多线程的使用
2021/02/23 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
培训演讲稿范文
2014/01/12 职场文书
考试退步检讨书
2014/01/15 职场文书
优良学风班总结材料
2014/02/08 职场文书
企业办公室主任岗位职责
2014/02/19 职场文书
大学生作弊检讨书
2014/02/19 职场文书
初中学校对照检查材料
2014/08/19 职场文书
行政诉讼答辩状
2015/05/21 职场文书
水浒传读书笔记
2015/06/25 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python