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-----30-----b is not defined
先分析c:30
ES5中,作用域分为全局作用域和函数作用域,c君未声明,直接赋值,即赋予了其全局光环,所以即使它囿于函数fn
范围内,但是依然可以跳脱出函数作用域的禁锢,自由活动,无论在哪都可打印出c君的值;
一句话:没有用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/