看this指向誰,要看執行時而非定義時(箭頭函數除外)。函數沒有綁定在對象上調用,非'strict'模式下,this指向window,不然爲undefinedjavascript
改變this指向的方法java
1. apply,當即執行數組
調用方法 fun.apply('想讓this指向誰'[,arr]);瀏覽器
參數以數組形式傳入app
舉個栗子(非嚴格模式):函數
function fun (params1, params2, params3) {
console.log('this:', this); console.log('name:', this.name);
console.log('入參:', params1, params2, params3); } let obj = { name: 'LQW' } fun(); fun.apply(obj, [1, 2, 3]);
結果: this: Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …} name: 入參: undefined undefined undefined
this: {name: "LQW"} name: LQW 入參: 1 2 3
2. call,當即執行post
調用方法 fun.call('想讓this指向誰'[,param1,param2,param3…]); this
與apply的入參不一樣,功能同樣spa
舉個栗子(非嚴格模式):code
function fun (params1, params2, params3) { console.log('this:', this); console.log('name:', this.name); console.log('入參:', params1, params2, params3); } let obj = { name: 'LQW' } fun(); fun.call(obj, 1, 2, 3); 結果: this: Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …} name: 入參: undefined undefined undefined this: {name: "LQW"} name: LQW 入參: 1 2 3
3.bind,返回一個函數,須要再次調用,bind是javascript高版本的方法,使用時需注意瀏覽器兼容性
調用方法 fun.bind('想讓this指向誰'[,param1,param2,param3…]);
與call入參相同,bind方法是apply和call的升級版
function fun (params1, params2, params3) { console.log('this:', this); console.log('name:', this.name); console.log('入參:', params1, params2, params3); } let obj = { name: 'LQW' } fun(); fun.bind(obj, 1, 2, 3)(); 結果: this: Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …} name: 入參: undefined undefined undefined this: {name: "LQW"} name: LQW 入參: 1 2 3