扒一扒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 相关文章推荐
js限制文本框为整数和货币的函数代码
Oct 13 Javascript
js Calender控件使用详解
Jan 05 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
JavaScript 面向对象与原型
Apr 10 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
Vue 使用中的小技巧
Apr 26 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
Feb 27 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 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/01/03 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
Python爬虫教程知识点总结
2020/10/19 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
法律工作求职自荐信
2013/10/31 职场文书
简单租房协议书范本
2014/08/20 职场文书
就业协议书
2014/09/12 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
亲属关系公证书样本
2015/01/23 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server