9.BOM:this指向問題、JS 執(zhí)行機制(同步任務、異步任務)

this指向問題

? this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰,一般情況下this的最終指向的是那個調(diào)用它的對象。

現(xiàn)階段,我們先了解一下幾個this指向

  1. 全局作用域或者普通函數(shù)中this指向全局對象window(注意定時器里面的this指向window)

  2. 方法調(diào)用中誰調(diào)用this指向誰

  3. 構造函數(shù)中this指向構造函數(shù)的實例

    <button>點擊</button>
    <script>
        // this 指向問題 一般情況下this的最終指向的是那個調(diào)用它的對象
        // 1. 全局作用域或者普通函數(shù)中this指向全局對象window( 注意定時器里面的this指向window)
        console.log(this);
        function fn() {
            console.log(this);
        }
        window.fn();
        window.setTimeout(function() {
            console.log(this);
        }, 1000);
        // 2. 方法調(diào)用中誰調(diào)用this指向誰
        var o = {
            sayHi: function() {
                console.log(this); // this指向的是 o 這個對象
            }
        }
        o.sayHi();
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
                console.log(this); // 事件處理函數(shù)中的this指向的是btn這個按鈕對象
            })
        // 3. 構造函數(shù)中this指向構造函數(shù)的實例
        function Fun() {
            console.log(this); // this 指向的是fun 實例對象
        }
        var fun = new Fun();
    </script>

JS 執(zhí)行機制

JavaScript 語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。這是因為 Javascript 這門腳本語言誕生的使命所致——JavaScript 是為處理頁面中用戶的交互,以及操作 DOM 而誕生的。比如我們對某個 DOM 元素進行添加和刪除操作,不能同時進行。 應該先進行添加,之后再刪除。

JS 是單線程

單線程就意味著,所有任務需要排隊,前一個任務結束,才會執(zhí)行后一個任務。這樣所導致的問題是: 如果 JS 執(zhí)行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞的感覺。

為了解決這個問題,利用多核 CPU 的計算能力,HTML5 提出 Web Worker 標準,允許 JavaScript 腳本創(chuàng)建多個線程。于是,JS 中出現(xiàn)了同步和異步。

同步和異步

同步

前一個任務結束后再執(zhí)行后一個任務,程序的執(zhí)行順序與任務的排列順序是一致的、同步的。比如做飯的同步做法:我們要燒水煮飯,等水開了(10分鐘之后),再去切菜,炒菜。

異步

你在做一件事情時,因為這件事情會花費很長時間,在做這件事的同時,你還可以去處理其他事情。比如做飯的異步做法,我們在燒水的同時,利用這10分鐘,去切菜,炒菜。
他們的本質區(qū)別: 這條流水線上各個流程的執(zhí)行順序不同。

JS中所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。

同步任務指的是:
  在主線程上排隊執(zhí)行的任務,只有前一個任務執(zhí)行完畢,才能執(zhí)行后一個任務;
異步任務指的是:
  不進入主線程、而進入”任務隊列”的任務,當主線程中的任務運行完了,才會從”任務隊列”取出異步任務放入主線程執(zhí)行。

同步任務
同步任務都在主線程上執(zhí)行,形成一個執(zhí)行棧。

異步任務
JS 的異步是通過回調(diào)函數(shù)實現(xiàn)的。

一般而言,異步任務有以下三種類型:
1、普通事件,如 click、resize 等
2、資源加載,如 load、error 等
3、定時器,包括 setInterval、setTimeout 等

異步任務相關回調(diào)函數(shù)添加到任務隊列中(任務隊列也稱為消息隊列)。

JS執(zhí)行機制(事件循環(huán))

  1. 先執(zhí)行執(zhí)行棧中的同步任務。
  2. 異步任務(回調(diào)函數(shù))放入任務隊列中。
  3. 一旦執(zhí)行棧中的所有同步任務執(zhí)行完畢,系統(tǒng)就會按次序讀取任務隊列中的異步任務,于是被讀取的異步任務結束等待狀態(tài),進入執(zhí)行棧,開始執(zhí)行。

由于主線程不斷的重復獲得任務、執(zhí)行任務、再獲取任務、再執(zhí)行,所以這種機制被稱為事件循環(huán)( event loop)。

 <script>
        console.log(1);
        document.onclick = function() {
            console.log('click');
        }
        console.log(2);
        setTimeout(function() {
            console.log(3)
        }, 3000)
    </script>
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容