前端乱弹99日之undefined
上一篇文章竟然已经是快3个月前写的了,这段时间也是发生了不少事情,自己的工作职责和项目也是变了又变,当然不变的还是那颗“伪装”前端程序员的心【嗯,对,没错,我现在是条后端狗】
这次参加了一个“自虐互助学习小组”,每周必须产出一篇技术博客,每个月必须录制一个技术视频,那么也刚好促进一下自己写东西整理。
当时原本计划写“函数调用栈”,但时间紧,任务重,这次还是接着变量提升的话题,继续聊聊undefined吧。
首先,看这么一段代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>前端乱弹99日第二日之undefined</title>
<script type="text/javascript">
var a;
console.log(a);
</script>
</head>
<body>
</body>
</html>
嗯,好吧,这段代码输出了undefined。
同时如果你有其他变成语言的基础的话,就单纯从字面上理解,我们确实是没有对a这个变量进行定义,所以就输出一个undefined,嗯,听起来也合理。
那么如果我们把var a这行删掉,会怎么样呢?
嗯,非常不幸,会输出这样一个报错:Uncaught ReferenceError: a is not defined
这里也会说a这个变量没有定义,那么两者有什么区别呢?
如果你还记得之前乱弹的那一段就会比较好理解,实际,我们的JavaScript的代码被载入到浏览器这个运行是有如下两个阶段:
第一个阶段是创建阶段,会优先创建全局变量(对,就是我们熟悉的Window对象),接着会根据帮助给我们的代码里的变量和方法进行分配空间
第二个阶段是根据我们的代码顺序,依次执行。
如果可以理解这个,就可以更好的理解,在JavaScript的代码里声明了一个变量(没有包在函数里的哦),就会在执行前给他分配相应的内存,如果没有给他赋值的话,那么他的值就是undefined。
顺着这个思路,当如果你在实际写代码的时候再次看到undefined这个报错的时候,是不是不那么慌了呢?当然如果你看到了Uncaught ReferenceError
这样的错误的话,也就该知道怎么排查了吧?
最后还有几个小的注意点,这里提一下:
1、undefined并不是一个保留字,你甚至可以把他作为变量名,但这种作死的事情最好不要做
2、想要判断一个变量是否为undefined,需要用全等于【对,就是===】
3、如果一个函数没有使用return指定返回值,他就会返回undefined
4、不要主动把一个变量的值设置为undefined,这基本也属于作死行为,会让你的程序很难调试。
其他还有待补充。主要参考的资料为:undefined - JavaScript | MDN