有趣的this以及apply,call,bind方法

看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
相關文章
相關標籤/搜索