扒一扒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 相关文章推荐
用JQuery 实现的自定义对话框
Mar 24 Javascript
科讯商业版中用到的ajax空间与分页函数
Sep 02 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
JavaScript模拟实现键盘打字效果
Jun 29 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
JavaScript之filter_动力节点Java学院整理
Jun 28 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
vue 对axios get pust put delete封装的实例代码
Jan 05 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
再次研究下cache_lite
2007/02/14 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python批量导出导入MySQL用户的方法
2013/11/15 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python实现超级玛丽游戏
2020/03/18 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
网络编辑职责
2014/03/01 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
客户经理岗位职责
2015/01/31 职场文书
团委副书记工作总结
2015/08/14 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
Python List remove()实例用法详解
2021/08/02 Python
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python