JavaScript中调皮的undefined

在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变,另一方面是用法不当还会产生很多意向不到的bug。有这种不靠谱的标识符的语言遗留问题,我们在编程时为了保证这家伙始终如一,保证我们的程序强壮性,就得使用一些手段了。

function foo() {
undefined = 2;//undefined
}
function bar(){
"use strict";
undefined = 2;//TypeError
}
foo();
bar();

从上面的运行来看,undefined在没有被关键字var执行声明的情况下,undefined的原始值并不能被直接修改。

"use strict";
var undefined = 2;//TypeError

在严格模式下全局上声明undefined并赋值还是报错。

var undefined = 2;
console.log(undefined);//undefined

全局非严格模式下undefined即使声明undefined为变量还是不能修改它的值。

function foo(){
"use strict";
var undefined = 2;
console.log(undefined);//
}
foo();

只有在非全局作用域下声明undefined为局部变量可改变值,且在严格模式下也能不报错。研究undefined的标识符被修改值绝对不是想修改它,而是我们要明白在什么情况下会因为无意的修改它的值,或者因为不恰当的操作会报错。这还只是一方面,另一方面是我要怎么样才能保证我们能获得一个真正的undefined的值。

通常我们为了保证我们局部作用域获得的undefined的值就是一个真正的undefined的值,有三种方式:

function foo(a,b,undefined){
console.log(a);
console.log(b);
console.log(undefined);
}
//在形参中定义undefined,但在实参中不传值
//就可以保证这个局部作用域下的undefined是一个真正的undefined
foo("a","b");
//在jQuery中,构建jQuery的模块时就使用了这种方法
(function(window,undefined){
//....
})(window);

还有一种情况就是不让表达式返回任何结果:

function doSomething(){
if(!APP.ready){
return void setTimeout(doSomething,100);
}
var result;
  //...
return result;
}
if(doSomething()){
//...
}

void运算符可以保证后面的程序正常执行,但永远返回undefined。这里setTimeout(...)函数会返回一个数值(计时器间隔的唯一标识符,用来取消计时器),但是为了保证if语句不产生误报(false positive),我们需要void去掉它。

最新文章

  1. BPM配置故事之案例14-数据字典与数据联动
  2. FZU 2144 Shooting Game
  3. 【Linux】rpm -qa 和 rpm -q
  4. Java Script基础(十) 访问样式表
  5. [转]基于SQL脚本将数据库表及字段提取为C#中的类
  6. 问题:LVM lvextend增加空间后,df查看还是原来空间
  7. 自己动手写PHP MVC框架
  8. 《编程珠玑》第二章 aha算法
  9. HDU 1312 Red and Black(bfs)
  10. Unity 3d中Shader是什么,可以吃吗?
  11. ubuntu16.04 编译运行 LSD-SLAM
  12. 使用reqire.js 生成二维码
  13. Eviews 8.0&9.0界面新功能介绍
  14. SpringBoot的学习【2.分析HelloWorld的依赖】
  15. Python单元测试unittest【转自https://www.cnblogs.com/feng0815/p/8045850.html】
  16. Linux 禁止普通用户su到root
  17. 线程安全的ConcurrentQueue<T>队列
  18. OpenGL实现通用GPU计算概述
  19. Centos7下添加Tomcat为系统服务
  20. hdu2609 最小表示法

热门文章

  1. 【CF809E】Surprise me! 树形DP 虚树 数学
  2. nginx 重定向 说明
  3. 使用kubeadm安装Kubernetes
  4. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
  5. neutron相关知识
  6. attr prop jquery关于获取DOM属性值的两个函数
  7. scrapy 基本命令
  8. yii2 阿里云短信 aliyun-dysms
  9. CodeFroces-- 511div2 C. Enlarge GCD
  10. n+lognlogV查找最大值