undefined和is not defined一样吗?

https://blog.csdn.net/sheldon178/article/details/48298151/

undefined和is not defined,字面意思看来没什么两样,不都是未定义吗?

在JavaScript中,可并非如此。

undefined定义如下:

undefined是javascript的一种基本数据类型,变量未赋值或者函数没有返回值时返回。

xx is not defined:

xxx is not defined是一种错误类型,其完整形式是:Uncaught ReferenceError: xxx is not defined(未捕获的引用错误),对象表明一个不存在的变量被引用,即:当你尝试引用一个未被定义的变量时,将会抛出一个 ReferenceError 。

由此可见:undefined和is not defined的本质区别在于:变量是否被定义。

接下来举个栗子把作用域和变量定义及未被定义说道说道。

涉及:局部变量,全局变量,作用域

undefined和is not defined一样吗?_第1张图片

前两天加了一个群,群主分享了一道小测试,恰巧让我有机会重新思考文章开头提到的问题。

打印结果依次为:undefined-----30-----b is not defined

先分析c:30

ES5中,作用域分为全局作用域和函数作用域,c君未声明,直接赋值,即赋予了其全局光环,所以即使它囿于函数fn

范围内,但是依然可以跳脱出函数作用域的禁锢,自由活动,无论在哪都可打印出c君的值;

一句话:没有用var声明的就是全局变量,即便在函数内部!
但如果有var声明的话,根据位置是否在函数内部判断到底是全局还是局部变量!

分析b:b is not defined

fn函数的作用域内,b作为局部变量,b君既被声明又被赋值,所以唯有在调用fn函数即 fn()后,b君才能彰显其价值,打印出值来

但b君相当委屈,虽然要啥有啥,但是圈禁在函数作用域内,所以作用域外部打印b时,是无法在全局作用域的范围内寻找到b君的踪影的,只有在函数作用域内console.log(b)才能看到b的值;

在全局作用域内,b君连声明都没有,我上哪找你去?所以只能Uncaught ReferenceError: b is not defined.

捕获不到你啊!

所以如果console.log(b)是在大括号{}内部,b就是20了,而不是is not defined了。

只有在function内部新声明的才是局部变量。

分析a:undefined

这里有个迷惑项,判断语句的大括号内部{}是个作用域吗?答:当然不是啦!

只有在function内部新声明的才是局部变量,在if、while,for里面声明的变量统统都是全局变量!

所以,a君其实是个全局变量,在解析过程中,先将a变量提升:var a;

然后进入判断语句,因为判断条件是false,所以无法进入判断语句内部,那么a无法被赋值,所以,打印a为undifined;

如果,把判断条件!f 改为f,即为true,那么console.log(a),打印的就是10啦!

所以,赋值阶段一定要和判断条件结合起来~

参考文章:https://blog.csdn.net/sheldon178/article/details/48298151/

你可能感兴趣的:(javascript)