扒一扒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 字符编码规则
May 04 Javascript
JavaScript 核心参考教程 内置对象
Oct 13 Javascript
判断JS对象是否拥有某种属性的两种方式
Dec 02 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
Feb 12 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
Feb 25 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 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实现可逆加密的方法
2015/08/11 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
asp.net和php的区别点总结
2019/10/10 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
JS 实现百度搜索功能
2018/02/01 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
Python实现统计代码行的方法分析
2017/07/12 Python
Python分治法定义与应用实例详解
2017/07/28 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
是否有自动比较结构的方法
2015/06/03 面试题
私人会所最新创业计划书范文
2014/03/24 职场文书
采购意向书范本
2014/03/31 职场文书
临床医师个人自我评价
2014/04/06 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
实习计划书范文
2015/01/16 职场文书
关于python中模块和重载的问题
2021/11/02 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL