扒一扒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 相关文章推荐
List the UTC Time on a Computer
Jun 11 Javascript
JQuery Easyui Tree的oncheck事件实现代码
May 28 Javascript
js Dialog 实践分享
Oct 22 Javascript
利用js实现遮罩以及弹出可移动登录窗口
Jul 08 Javascript
浅析LigerUi开发中谨慎载入common.css文件
Jul 09 Javascript
Javascript 是你的高阶函数(高级应用)
Jun 15 Javascript
ES6中的箭头函数实例详解
Apr 06 Javascript
Angular 如何使用第三方库的方法
Apr 18 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 jQuery
微信小程序实现上传多个文件 超过10个
Mar 30 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
实现AJAX异步调用和局部刷新的基本步骤
Mar 17 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
DSP接收机前端设想
2021/03/02 无线电
PHP 彩色文字实现代码
2009/06/29 PHP
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
Python写入数据到MP3文件中的方法
2015/07/10 Python
Python分治法定义与应用实例详解
2017/07/28 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Windows下python3.7安装教程
2018/07/31 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
教育专业自荐书范文
2013/12/17 职场文书
创先争优标语
2014/06/27 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
《叶问2》观后感
2015/06/15 职场文书
高中军训感想
2015/08/07 职场文书
无故旷工检讨书
2015/08/15 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
解析Java中的static关键字
2021/06/14 Java/Android