看下面的程式碼:
if (!("aa" in window)) {
alert('oh my god');
var aa = 1;
}
alert("aa" in window);
alert(aa);
回答以下問題:
會報錯嗎?會彈出幾次?
第2個alert是true還是false?
第3個alert彈出什麼?
為什麼?
思考下,然後測試下,如果你回答正確,那麼後面的文章就不用看了。
------------------------------
在JS裡定義變數太簡單了,直接一個var ,甚至不用var都可以:
var a = 1;
這裡a就是變數名,1就是變數值。唉,這個太基礎了。看下面的程式碼:
var a;
alert(a);
以firebug測試,會彈出undefined,這個是大家很熟悉的一個字串了,貌似表示變數未定義。但我覺得,我已經var了啊,這就是定義了嘛,只是沒有附值而已。
我們來個真正的沒有定義的:
alert(a);
沒錯,就是直接alert一個根本沒有出現過的變量,這會如何?
firebug直接報錯了:a is not defined.意思是a沒有定義。這個結合前面的程式碼來看,讓人困惑。這個沒有定義和前面的未定義有什麼不同呢?
其實前面的程式碼等價於這樣的:
var a = undefined;
alert(a);
也就是說,當宣告變數而不賦值時,JS會給變數傳一個undefined值,注意,這是個“值”,說明a已經有值了,這個值就叫“未定義”。
而後面的直接alert,變數從來沒有出現過,也就是說這才是真正的未定義。
簡單的說:JS中不存在沒有值的變數,變數宣告的時候就賦值了。
然後我們看下面的程式碼:
alert(a);
var a = 1;
這個程式碼會報錯嗎?因為在alert的時候變數a還來不及出現呀。
但是這樣居然沒有報錯,而是彈出了undefined值。表示變數a已經存在了,只是值卻不是我們想要的,而是undefined。這又是個什麼問題呢?
因為var 變數宣告跟函數宣告一樣,會提前,其實上面的程式碼是這樣的:
var a;
alert(a);
a = 1;
這麼一來就懂了。
所以,這個問題的關鍵在於:var 聲明會提前到作用域頂端,但附值卻不會—--好糾結的設定,不知道為什麼要這麼搞。個人覺得這是JS的缺陷。
現在有一種程式碼習慣,主張把變數宣告一律放在作用域前方,大概就是考慮到這個--反正就算你不寫在前方,JS也會提前到前方。
現在放出文首問題的答案:
只會彈出兩個alert,而if裡面的alert不會執行,因為var聲明的提前性,導致真正的程式碼是這個樣子:
var aa;
if (!("aa" in window)) {
alert('oh my god');
aa = 1;
}
alert("aa" in window);
alert(aa);
雖然aa為空,但用'aa' in window判斷時會為真,因為a確實存在了,而值是undefined。所以if程式碼不會執行。後面兩個alert我就不說了。
個人覺得這是一個很無厘頭的問題,我們應該了解他的原因,但鄙視他這種陷阱。
上面這個問題也是我寫這篇文章的緣由,這段程式碼是我從一篇網文裡看到的,但他裡面沒有答案,我百撕不得騎姐,跑到stackoverflow上去問了才搞清楚。答案就是這篇文章。
但這是很基礎的問題啊其實! ! !
哈哈,原諒我,後面還有一個問題:
var b = {}
alert(b.aa);
alert(b.aa.bb);
這也是一種宣告變數的方式,那麼,這段程式碼會報錯嗎?為什麼?

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),