javascript中關於this的概念理解
阿新 • • 發佈:2021-02-02
this 繫結規則
要了解this的繫結規則之前,首先要了解的是this是什麼?
this是一種繫結,要找到this繫結的物件:就是要 尋找 “函式被呼叫的位置”並不是宣告的位置。
this有四條繫結規則
- 預設繫結
- 隱式繫結
- 顯式繫結
- new繫結
這其中預設繫結、顯示繫結、new繫結非常好理解,這裡著重要理解的是隱式繫結,因為回撥函式的時候常常會存在"隱式丟失"。來看下面的例子
var x = 4; var obj = { x: 3, bar: function () { var x = 2; setTimeout(function () { console.log(x); //----2 console.log(this.x); //----3 }, 1000); console.log(this.x) // --- 1 這個代表執行順序 } } obj.bar(); //這裡兩個打印出來的x分別是: // 3 // 2 // 4
先來看一下程式碼執行的過程
呼叫obj.bar()
時,計時器setTimeout執行一秒後將回調函式放入事件佇列,繼續執行程式碼輸出列印第一個 x 的值。接著瀏覽器迴圈事件佇列執行回撥函式,列印第二個 x 和第三個 x 。
第一個 x 是通過obj
找到的bar
,this
繫結的是obj
,所以打印出obj中的 3 。
第二個 x 是通過 閉包 得到的值為 2 。
第三個 x 是通過回撥函式的執行,此時的執行環境或者說函式的呼叫位置已經不在obj
中了,而全域性作用域,this
所繫結的就是window
(實際上setTimeout就是window.setTimeout( ))所以這裡打印出的是 4 。