this指向問題
? this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰,一般情況下this的最終指向的是那個調(diào)用它的對象。
現(xiàn)階段,我們先了解一下幾個this指向
全局作用域或者普通函數(shù)中this指向全局對象window(注意定時器里面的this指向window)
方法調(diào)用中誰調(diào)用this指向誰
構造函數(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))
- 先執(zhí)行執(zhí)行棧中的同步任務。
- 異步任務(回調(diào)函數(shù))放入任務隊列中。
- 一旦執(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>
