扒一扒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 UI AutoComplete 自动完成使用小记
Aug 21 Javascript
JS操作数据库的实例代码
Oct 17 Javascript
C++中的string类的用法小结
Aug 07 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
用JS实现图片轮播效果代码(一)
Jun 26 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
微信小程序 chooseImage选择图片或者拍照
Apr 07 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
Jul 27 Javascript
vue.js使用3DES加密的方法示例
May 18 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 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
使用php4加速网络传输
2006/10/09 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
剖析Angular Component的源码示例
2018/03/23 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
利用Psyco提升Python运行速度
2014/12/24 Python
构建Python包的五个简单准则简介
2015/06/15 Python
浅谈Python基础之I/O模型
2017/05/11 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
请解释流与文件有什么不同
2016/07/29 面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
学前教育毕业生自荐信
2013/10/29 职场文书
服务中心夜班服务员岗位职责
2013/11/27 职场文书
自主招生自荐书
2013/11/29 职场文书
仓库保管员岗位职责
2013/12/20 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers