this的指向問題及改變this指向
阿新 • • 發佈:2022-04-11
概念:
this是執行環境下的一個系統變數, 由於this在不同的執行環境下有不同的值, 所以在使用this時,多加註意 (使用this之前,先列印)
1,在全域性作用域下,this預設指向window(前端執行環境),{}(後端執行環境).
2,在事件函式中,this指向繫結事件的目標
3,在建構函式中,this指向建構函式將要建立的物件
4,在物件中,this指向物件本身
特殊情況:(1) 有函式巢狀時,內層的函式this不會繼承外層函式的this的值,會被還原成window
如果像讓內層函式的this和外層函式this統一指向, 內層函式請使用箭頭函式(因為箭頭函式沒有自己的this,會在上下文查詢 )
(2)在ajax回撥函式中, this指向window
修改this指向
修改this指向: 三種方法 call apply bind
function add(a, b) {
console.log(8, this, a + b)
}
add(3, 4)
1, 通過call函式修改this指向, 用函式直接呼叫call(),
第一個引數是this修改後的指向(支援引用型別,如果傳入值型別會自動裝箱),
後邊的引數是函式add的原始引數, 呼叫call時會直接執行add函式。
add.call("李四", 5, 6)
2,通過apply函式修改this指向, 用函式直接呼叫apply(),
第一個引數是this修改後的指向(支援引用型別,如果傳入值型別會自動裝箱),
後邊的引數是函式add的原始引數所在的陣列,
呼叫apply時會直接執行add函式
add.apply(false, [5, 6])
3,通過bind函式修改this指向,用函式不會直接呼叫bind(),
第一個引數是this修改後的指向(支援引用型別,如果傳入值型別會自動裝箱),
後邊的引數是函式add的原始引數, 呼叫bind時不會直接執行add函式
var obj = { name: "思聰", age: 10 }
呼叫bind後會返回一個新的函式
var newAdd = add.bind(obj, 5, 6)
呼叫新的函式得到修改後的this
newAdd() 3,call和apply和bind的異同點:
(一), call和apply 修改this指向時會立即呼叫函式, bind修改指向不會立即呼叫函式會, 返回一個新函式
(二), call,bind的第二個引數是函式的原始引數寫法, apply的第二個引數必須是陣列, 陣列中放的是原始引數
4,使用場景: (一), call 適合在呼叫函式時修改this指向, 直接使用call或apply修改即可
(二), bind 適合在修改this指向時, 不立即呼叫函式, 而是時機成熟時在呼叫的情況, 如: 計時器, ajax請求等非同步回撥函式的修改 注意:事件函式修改this時,一定要用bind
btn6.onclick = function () {
console.log(9, this)
}.bind(document.body)
呼叫bind後會返回一個新的函式
var newAdd = add.bind(obj, 5, 6)
呼叫新的函式得到修改後的this
newAdd() 3,call和apply和bind的異同點:
(一), call和apply 修改this指向時會立即呼叫函式, bind修改指向不會立即呼叫函式會, 返回一個新函式
(二), call,bind的第二個引數是函式的原始引數寫法, apply的第二個引數必須是陣列, 陣列中放的是原始引數
4,使用場景: (一), call 適合在呼叫函式時修改this指向, 直接使用call或apply修改即可
(二), bind 適合在修改this指向時, 不立即呼叫函式, 而是時機成熟時在呼叫的情況, 如: 計時器, ajax請求等非同步回撥函式的修改 注意:事件函式修改this時,一定要用bind
btn6.onclick = function () {
console.log(9, this)
}.bind(document.body)