首先,先解釋一下産生不同的結果的原因:
我們知道,var跟let的核心差別主要就是作用域的問題。
詳細解釋:
因為let i 聲明的是區塊變量,每個i隻能存活到大括号結束,并不會把後面for循環的 i 值賦給前面的setTimeout中的i;
而var i 則是局部變量,這個 i 的生命周期不受for循環的大括号限制;
這道面試題還涉及到了JavaScript中的事件循環機制,稍微重點講解一下:
我們知道,JavaScript是單線程的(一次隻能執行一個任務),那單線程是如何做到異步的呢?
在大學裡,資料結構中,我們學過棧(先進後出)和隊列(先進先出)這兩種資料結構吧。
js引擎中,便用到了,棧中存放執行的代碼,隊列中存放多個任務。
事件循環機制(Event Loop):js會檢查棧中是否為空,為空的話,将隊列中的任務加入到這個棧中。
這樣的話,還是不能實作異步的,畢竟js是單線程,一次隻能執行一個任務,即使有棧和隊列,還是不能實作異步的,那異步到底是怎麼實作的呢?
這裡需要了解一下回調函數,舉個例子,jQuery中Ajax異步請求我們經常用到吧,其中的success就是個回調函數。
其實呢,如果是個異步操作的話,當放入到隊列中後,它會注冊一個回調事件,然後再執行這個回調函數,如此,便實作了異步。
舉個例子吧:
分析:前兩行代碼定義變量便列印出來,接下來便是個異步操作,便是通過resolve回調函數來真正實作異步的。
乍一看,給人一種很是高大上的感覺。這東西呢,了解起來真的是雲裡霧裡的。
柯裡化,是函數式程式設計裡面的一個概念。
說下初步的了解吧
正如上面的代碼,本來add方法裡面需要傳遞2個參數,函數柯裡化後,類似curriedAdd隻需要傳遞1個參數即可。這便是所謂的函數柯裡化。當然,這上面并不夠标準,隻是表達了柯裡化的思想。
那函數柯裡化的好處是什麼呢?既然提出了這個概念,沒有好處是不可能滴!
簡單來說就是為了簡便,調用函數的時候,隻需傳遞一個參數。當然了,我了解得還不夠深,沒達到那種透徹的地步,仍然有點雲裡霧裡的感覺,沒充分地體會到函數柯裡化的好處。
發現自己還有很長的一段路要走!鑽的還是不夠深!不夠精!