写出更好的JavaScript程序之undefined篇(中)


Posted in Javascript onNovember 23, 2009

写在前面的依然是消歧义声明:本文中JavaScript是指一般意义上的JavaScript,并不只限定“自称是JavaScript”的运行环境;“全局变量”和“全局对象的属性”是指同样的东西,只是因为要配合上下文才用了不同的说法,正文中我就不再另外解释了;“声明”指通过“var”语句声明变量和/或对函数及其签名的定义;“变量”指通过“var”语句声明过或者在函数体中试图访问的命名参数;“undefined”指名为“undefined”的值(全局或本地变量),而“未定义”指type(...) == “undefined”的概念值;“output”是向我们显示传入参数的函数,其实就是“alert”的同类。

首先介绍的是和void(0)具有异曲同工之妙的一种办法,我们知道在JavaScript中尝试访问任何一个“没有返回值”的函数的执行结果,都会得到“未定义”这个概念值,所以我们可以这样做:
myVar = function(){}();
这个方法的原理是创建一个空函数,并且获取其(根本不存在的)返回值。很明显,我们会得到“未定义”这个概念值,这个原理是和void(0)一样的。
需要特别注意的是,只有当function关键字不在语句之首的时候,才可以使用这种调用方式;如果需要直接调用一个匿名函数,应该这样做:

(function(){
// code here
})();
假如我们不想污染全局作用域,我们就可以用这种方式来创造一个闭包——很多现有的JavaScript库就是这样做的。
这种办法是在不了解void(0)的执行效果的情况下诞生的,既然我们知道void(0),也就不需要这种办法了。

第二种不常见的办法是访问window.undefined,就像下边这样:
output(myVar === window.undefined);
myVar = window.undefined;
这种办法的原理是:
如果JavaScript的运行环境预定义了undefined这一值,window.undefined就可以直接访问到;
如果没有预先定义undefined这一值,window.undefined就会返回“未定义”这一概念值——还是我们想要的东西。
访问形式从“全局变量”变成“属性”以后,脚本引擎就不会认为这是一个意外操作了,因此代码可以正确执行。

然而这种办法还是存在不足:
undefined在所有的JavaScript引擎中都不是保留字,也就是说它是可以被污染的,这会影响我们的程序的运行效果;
直接访问全局对象的属性效率是很差的,应该避免这么做。

因此,接下来就要介绍我所见过的最为有趣的办法——在本地声明undefined变量!
它的做法是这样的:
function myFunc(){
var undefined;
// some code here
output(myVar === undefined);
myVar = undefined;
}
说到这里我要提一下,有的人对“早期的浏览器上没有undefined”这一说法有不同的理解,认为上面这样的做法是行不通的。
而我认为这种观点是不对的,在我的印象中(大约是2003年),IE5虽然没有预定义undefined,但并不影响我们的不指派声明。
不过毕竟是很多年前的事情,记忆模糊,为了避免想当然造成的错误,我特地装了Windows 98来实验一下:
写出更好的JavaScript程序之undefined篇(中)
写出更好的JavaScript程序之undefined篇(中)

上面两幅是用了QQ屏幕截取 ,不知道为什么变成了JPG,下边这幅是用OneNote截取的。

写出更好的JavaScript程序之undefined篇(中)

由此可以得出,为这样不指派声明undefined变量担忧是多余的。
前一篇解释过,在JavaScript中,如果尝试读取一个没有预定义也未声明过的变量,会引发一个“不存在(未定义)”异常,因此在早期的浏览器上如果直接访问undefined的操作可能会失败。
这种(引发异常的)现象可能是为了方便排除故障而有意设计的;而对于声明过的变量,即使是未经赋值,也不会在读取的时候引发异常——经过声明就表示开发人员确定有“这个东西”。

上面这种在函数作用域内声明本地变量undefined的做法,既解决了引用未声明变量会引发异常的问题,又避免了受全局变量污染的影响,还取代了void(0)这种乍看之下意味不明的小把戏,不仅没有造成难以觉察的拼写错误的隐患,还能提高运算效率——真是一举N得的妙招!
所以了解了这么多之后就发现,最后介绍的这种办法实在是居家旅行、杀人灭口的首选
如果有人问:“undefined应该怎么用?”我们现在就可以回答:就这么用!

终于到了结尾,有的人可能忍不住要问了:为什么在这个系列中我的代码示例都用三个等号的“严格相等”来比较?两个等号的普通的“相等”有什么问题吗?
这就是这个系列的下篇要讲解的内容:undefined及其各种等价形态的适用场合。

Javascript 相关文章推荐
javascript使用appendChild追加节点实例
Jan 12 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
用JS中split方法实现彩色文字背景效果实例
Aug 24 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
Dec 01 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
May 16 Javascript
小程序如何写动态标签的实现方法
Feb 05 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
通过身份证号得到出生日期和性别的js代码
Nov 23 #Javascript
javascript 在网页中的运用(asp.net)
Nov 23 #Javascript
javascript DOM编程实例(智播客学习)
Nov 23 #Javascript
传智播客学习之java 反射
Nov 22 #Javascript
Javascript 刷新全集常用代码
Nov 22 #Javascript
写出更好的JavaScript之undefined篇(上)
Nov 22 #Javascript
COM中获取JavaScript数组大小的代码
Nov 22 #Javascript
You might like
php实现概率性随机抽奖代码
2016/01/02 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Python中特殊函数集锦
2015/07/27 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
5款实用的python 工具推荐
2020/10/13 Python
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
UNIX文件类型
2013/08/29 面试题
《问银河》教学反思
2014/02/19 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
贷款工资证明范本
2015/06/12 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python