天天看點

this指向(強行改變指向)this 指向(!重要!重要!重要)強行改變 this 指向

this 指向(!重要!重要!重要)

+ 是一個 關鍵字
+ 是一個 使用在 作用域内的 關鍵字
=> 要麼使用在全局
=> 要麼使用在函數内部
在函數内使用 this 關鍵字(熟讀并背誦全文)
+ **和函數的定義方式沒有關系, 和函數在哪定義沒有關系, 隻看函數怎麼調用(箭頭函數除外)**
1. 普通調用(全局調用)
=> 書寫: 函數名()
=> 該函數内的 this 指向 window
2. 對象調用
=> 書寫: xxx.函數名()
=> 該函數内的 this 指向, 點前面是誰就是誰
3. 定時器處理函數
=> 書寫:
-> setInterval(函數, 數字)
-> settimeout(函數, 數字)
=> 該函數内的 this 指向 window
4. 事件處理函數
=> 書寫:
-> xxx.onclick = 函數
-> xxx.addEventListener(事件類型, 函數)
=> 該函數内的 this 指向 事件源(誰身上的事件)
5. 自執行函數
=> 書寫:
-> (函數)()
-> !函數()
-> ~函數()
=> 該函數内的 this 指向 window
6. 未完待續...

強行改變 this 指向

+ 不管你本身指向什麼位置, 我讓你指向哪, 你就得指向哪
1. call()
+ 文法:
=> 函數名.call()
=> 對象名.函數名.call()
+ 參數:
=> 第一個參數: 要修改的函數内的 this 指向
=> 第二個參數開始: 依次給函數内每一個參數指派
+ 特點:
=> 會立即調用函數
+ 用處:
=> 在立即執行的函數時才使用
=> 事件處理函數, 和 定時器處理函數, 一般不會使用這個方法
2. apply()
+ 文法:
=> 函數名.apply()
=> 對象名.函數名.apply()
+ 參數:
=> 第一個參數: 要修改的函數内的 this 指向
=> 第二個參數: 是一個數組或者僞數組
-> 數組或者僞數組内的每一個依次給函數傳遞實參
+ 特點:
=> 會立即調用函數
+ 作用:
=> 在立即執行的函數時才使用
=> 事件處理函數, 和 定時器處理函數, 一般不會使用這個方法
3. bind()
+ 文法:
=> 函數名.bind()
=> 對象名.函數名.bind()
+ 參數:
=> 第一個參數: 要修改的函數内的 this 指向
=> 第二個參數開始: 依次是給函數内的每一個參數指派
+ 特點:
=> 不會立即調用函數
=> 傳回一個新的函數給你, 新的函數内的 this 是改變好的 this
+ 作用:
=> 在非立即調用的函數時使用
=> 因為他不會立即調用函數, 而是傳回一個改變好 this 指向的函數

繼續閱讀