扒一扒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-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
用box固定长宽实现图片自动轮播js代码
Jun 09 Javascript
JavaScript原型及原型链终极详解
Jan 04 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
使用JS判断移动端手机横竖屏状态
Jul 30 Javascript
Angular路由ui-router配置详解
Aug 01 Javascript
详解Vue CLI3配置解析之css.extract
Sep 14 Javascript
解决layui-open关闭自身窗口的问题
Sep 10 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
js+canvas实现转盘效果(两个版本)
Sep 13 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+DBM的同学录程序(4)
2006/10/09 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
php简单日历函数
2015/10/28 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
java直接调用python脚本的例子
2014/02/16 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Python 从attribute到property详解
2020/03/05 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
信息管理应届生求职信
2014/03/07 职场文书
决心书范文
2014/03/11 职场文书
青年志愿者活动方案
2014/08/17 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
消防演习通知
2015/04/25 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技