扒一扒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下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
javascript实现促销倒计时+fixed固定在底部
Sep 18 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
浅谈jquery事件处理
Apr 24 Javascript
javascript实现日期按月份加减
May 15 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
JS选取DOM元素的简单方法
Jul 08 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
Jun 11 Javascript
Vue.js特性Scoped Slots的浅析
Feb 20 Javascript
JavaScript实现简单计算器功能
Dec 19 Javascript
vue+element 实现商城主题开发的示例代码
Mar 26 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/03/16 PHP
图像替换新技术 状态域方法
2010/01/28 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
外科实习自我鉴定
2013/10/06 职场文书
实习生自我鉴定范文
2013/12/05 职场文书
办公室经理岗位职责
2014/01/01 职场文书
承办会议欢迎词
2014/01/17 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
春游踏青活动方案
2014/08/14 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
罚站检讨书
2015/01/29 职场文书
详解python的异常捕获
2022/03/03 Python