JS Q&A小記錄

  • 變量、函數–聲明與表達式

      變量聲明和函數聲明會提升到該函數或外部函數作用域的頂部,函數聲明優先級高於變量聲明。但是變量的賦值會留在原位。所以函數聲明的函數可以被提前引用,但是變量提前引用會被判定爲undefined。
      注意ES6標準,用let聲明的變量只在所在代碼塊中有效而且不會被提升。
      而函數定義表達式中,函數的聲明雖然也會提前,但是賦值並不能提前,所以該函數無法在表達式定義之前被引用。
       函數與變量同名,且函數聲明在先時,如果變量有賦值,則函數聲明被覆蓋,若沒有賦值,則變量聲明被忽略。

  • 算術運算符 

      +:字符串優先
       -:數值優先

  • Event Loop

      js的一大特點是單線程,這意味着所有的任務都需要排隊執行。任務分爲同步和異步兩種類型。
       js中的同步不同於其他語言的同步(多線程),是指按照代碼順序執行任務。
       1.同步任務執行時生成一個執行棧。
       2.異步任務是不進入主線程的。只要異步任務有了運行結果,就在”任務隊列”之中放置一個事件。
       3.一旦”執行棧”中的所有同步任務執行完畢,系統就會讀取”任務隊列”,看看裏面有哪些事件。那些對應的異步任務,於是結束等待狀態,進入執行棧,開始執行。
       “任務隊列”是一個事件的隊列,IO設備和用戶產生事件都會在“任務隊列”中添加一個事件。只要指定過回調函數,這些事件發生時就會進入”任務隊列”,等待主線程讀取。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。
      除了放置異步任務的事件,”任務隊列”還可以放置定時事件,即指定某些代碼在多少時間之後執行。這叫做”定時器”(timer)功能,也就是定時執行的代碼。
      定時器功能主要由setTimeout()和setInterval()這兩個函數來完成。setTimeout()接受兩個參數,第一個是回調函數,第二個是推遲執行的毫秒數。如果將setTimeout()的第二個參數設爲0,就表示當前代碼執行完(執行棧清空)以後,立即執行(0毫秒間隔)指定的回調函數。
      總之,setTimeout(fn,0)的含義是,指定某個任務在主線程最早可得的空閒時間執行,也就是說,儘可能早得執行。它在”任務隊列”的尾部添加一個事件,因此要等到同步任務和”任務隊列”現有的事件都處理完,纔會得到執行。HTML5標準規定了setTimeout()的第二個參數的最小值(最短間隔),不得低於4毫秒,如果低於這個值,就會自動增加。
      以上內容參考阮一峯大大寫的博客

    http://www.ruanyifeng.com/blog/2014/10/event-loop.html

發佈了42 篇原創文章 · 獲贊 34 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章