扒一扒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 相关文章推荐
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
jQuery中offsetParent()方法用法实例
Jan 19 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
Jul 13 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
Sep 05 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 Javascript
简单了解微信小程序的目录结构
Jul 01 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
Vue打包后访问静态资源路径问题
Nov 08 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
extjs render 用法介绍
2013/09/11 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
vue中轮训器的使用
2019/01/27 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
浅析NumPy 切片和索引
2020/09/02 Python
如何解决python多种版本冲突问题
2020/10/13 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
教育学习自我评价
2014/02/03 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
社区服务活动报告
2015/02/05 职场文书
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python