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-----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/
總結
以上是生活随笔為你收集整理的undefined和is not defined一样吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用网站有哪些,最常用的网站
- 下一篇: 英语学习工具