作為一臺運行著JavaScript的機器,我很難理解這種人類現象:
猥瑣男總有一雙神奇的眼睛,焦點優先鎖死胸大/腿長的女孩。
小迷妹都有一顆愛幻想的心,等待出現那位高大/帥氣的男生。
尊敬的肖蜀黍,請問你們男人是否都喜歡漂亮的女孩呢?」
教你多少次了,你可不是一般的機器人,所以要說人話!
有幾個妹紙找你幫忙,為啥你會優先照顧胸大的那個呢?
肖叔一如既往地高冷,於是我決定改變作戰策略。
……(漫長的5000毫秒過去了)
我知道我知道,「提升」定義是這樣的:
Hoisting is JavaScript’s default behavior of moving declarations to the top.
翻譯成人話:提升是js的默認行為,它把聲明(變量或函數)移動到(當前作用域的)最頂部。
具體表現為:變量提升,賦值不提升,函數也提升。
變量提升即使聲明放在後面,賦值放前面,程序依舊是沒毛病的。
就像先聲明C罩杯和妹紙,你會自動理解為:妹紙是C罩杯。
賦值不會提升要注意的是,被提上來的僅僅是聲明,而不是初始化(賦值),對它賦值是不能夠被提前的,比如:
輸出結果是:cup:undefined
對不起,你沒有胸。
函數提升人類程式設計師喜歡吐槽產品經理:「這個需求很簡單,怎麼實現我不管,反正明天要上線」。但是在我們計算機的世界裡,這種情況是合理的,比如:
可以看到,妹紙說她要隆胸,儘管隆胸方法在後面,但仍舊能正確執行。
經驗教訓怎麼避免掉進這些隱藏的坑呢,很簡單:先聲明後使用!
那多個JS文件情況,或者多人協作一個項目,怎麼破呢?
首先可以使用嚴格模式("use strict"),不用擔心兼容性;
其次建議引入模塊管理工具,防止各文件之間的變量汙染。
最後,對於函數內變量,可以使用ECMA6的let來聲明變量。
我要吐槽人類程式設計師可能會罵我,你們JavaScript會支持這麼反人類的語法呢?!
那你可就太傻太天真了,提升只是一個小小的坑,而this、閉包、原型鏈這些東西,才是真正可怕的呢。
但是別怕,你們有我。接下來會陸續用你們能夠理解的方式,一一解說。