1. 程式人生 > 其它 >this的指向問題及改變this指向

this的指向問題及改變this指向

概念: 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)