扒一扒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 instanceof 与typeof使用说明
Jan 11 Javascript
javascript中检测变量的类型的代码
Dec 28 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
node.js中的fs.ftruncate方法使用说明
Dec 15 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
Aug 11 Javascript
Django+Vue跨域环境配置详解
Jul 06 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
基于JavaScript实现瀑布流布局
Aug 15 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
JavaScript基础之this和箭头函数详析
Sep 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
php mysql数据库操作类
2008/06/04 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP对象相关知识总结
2017/04/09 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
入党转预备思想汇报
2014/01/07 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
优秀员工演讲稿
2014/05/19 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
电工实训报告总结
2014/11/05 职场文书