改變函數執行時,裏面this指向對象node
call數組
call()
方法裏面第一個參數時this指向對象,第二個參數是函數執行時要傳入的參數,只能一個一個的傳入瀏覽器
const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello() Hello.call(obj, c) // 打印結果 window {...} a=1b=2c=undefined {a: "李狗蛋", b: "王翠花"} a=李狗蛋b=王翠花c=3
正常狀況下,Hello
函數是全局對象window
上掛載的一個函數,函數執行時,this應該指向調用它的對象window
,可是經過call
方法傳入了obj
對象,讓函數裏面的this變成了obj
對象app
瀏覽器環境或者非嚴格模式下,若是傳入null
或者undefined
,則this將會指向全局對象window
,若是是其餘環境,如node,this則指向global
函數
// 注意聲明變量時,必定要用var,若是用const,let,則會顯示undefined // 經過var,至關於在window全局對象上聲明瞭a和b兩個屬性 var a = 1 var b = 2 const c = 3 function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello.call(null, c) // 打印結果 window{...} a=undefinedb=2c=3
若是是在嚴格模式下,this將不會發生改變,傳入什麼就是什麼this
// 嚴格模式 'use strict' var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello.call(null, c) // 打印結果 null 報錯:Cannot read property 'a' of null at Hello
apply3d
aplly
方法是用來改變函數執行時this指向對象,方法有兩個參數,第一個參數是this指向的對象,第二個參數是函數執行時要傳入的參數,必須是一個數組code
var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello(c) Hello.apply(obj, [c]) // 打印結果 window {...} a=1b=2c=3 {a: "李狗蛋", b: "王翠花"} a=李狗蛋b=王翠花c=3
能夠看到同call
同樣,正常狀況下,Hello
函數是全局對象window
上掛載的一個函數,函數執行時,this應該指向調用它的對象window
,可是經過apply
方法傳入了obj
對象,讓函數裏面的this變成了obj
對象對象
瀏覽器環境或者非嚴格模式下,若是thisArg
傳入null
或者undefined
,則this將會指向全局對象window
,若是是其餘環境,如node,this則指向global
ip
var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello.apply(undefined, [c]) // 打印結果 window {...} a=1b=2c=3
若是是在嚴格模式下,thisArg將不會發生改變,傳入什麼就是什麼
'use strict' var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s) } Hello.apply(undefined, [c]) // 打印結果 undefined 報錯:Cannot read property 'a' of undefined at Hello
bind
bind
也是用來改變thisArg
指向對象的,第一個參數是函數執行時的thisArg
指向對象,第二個對象是傳入到函數裏面的參數,這個方法同call
差很少
Tips
Tips
Tips
一、bind
是返回一個函數,而不是像call
,apply
同樣當即調用,而是須要手動去調用觸發函數
二、bind
傳入的參數並不等同於原函數傳入的參數,而是在原函數的參數前面做爲新增參數,添加進去,原來參數多餘的就清除掉
var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s, d, k) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s + 'd=' + d + 'e=' + k) } Hello() Hello.bind(obj, c)(7, 8, 9) // 打印結果 window {...} a=1b=2c=undefinedd=undefinede=undefined {a: "李狗蛋", b: "王翠花"} a=李狗蛋b=王翠花c=3d=7e=8 // 9沒了,由於只有三個形參位置,bind加了一個,最後的9就要清除掉
瀏覽器環境或者非嚴格模式下,若是thisArg
傳入null
或者undefined
,則this將會指向全局對象window
,若是是其餘環境,如node,this則指向global
var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s, d, k) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s + 'd=' + d + 'e=' + k) } Hello.bind(undefined, c)(7, 8, 9) // 打印結果 window {...} a=1b=2c=3d=7e=8
若是是在嚴格模式下,thisArg將不會發生改變,傳入什麼就是什麼
'use strict' var a = 1 var b = 2 const c = 3 const obj = { a: '李狗蛋', b: '王翠花', } function Hello (s, d, k) { console.log(this) console.log('a=' + this.a + 'b=' + this.b + 'c=' + s + 'd=' + d + 'e=' + k) } Hello.bind(undefined, c)(7, 8, 9) // 打印結果 undefined 報錯:Cannot read property 'a' of undefined at Hello