JavaScript中的call()和bind()是兩個(gè)常用的方法,用于在運(yùn)行時(shí)改變函數(shù)的執(zhí)行上下文。在開(kāi)發(fā)中,我們常常需要向一個(gè)對(duì)象中注入一個(gè)函數(shù)并綁定它的執(zhí)行上下文。這就需要使用到call()和bind()這兩個(gè)方法。
call()函數(shù)調(diào)用一個(gè)方法, 以指定一個(gè)作為當(dāng)前對(duì)象的對(duì)象。因此我們可以借用一個(gè)對(duì)象的方法,獲得一個(gè)獨(dú)立于該對(duì)象的類的操作方式。call()和apply()的區(qū)別在于call()接收的是參數(shù)列表,而apply()接收的是數(shù)組。下面是一個(gè)例子:
var name = "小明"; var obj = { name: "張三" }; function say() { console.log(this.name); } say.call(obj); // 輸出: 張三
在上面的例子中,我們使用call()方法指定了函數(shù)say()的上下文為obj對(duì)象。call()函數(shù)通過(guò)指定的this對(duì)象去調(diào)用原來(lái)的函數(shù),使函數(shù)中的this指向這個(gè)新的對(duì)象。
bind()函數(shù)會(huì)創(chuàng)建一個(gè)新函數(shù),被調(diào)用時(shí)其this值由第一個(gè)參數(shù)指定,該函數(shù)的返回值與$i原函數(shù)的返回值相同,除了在使用 new 運(yùn)算符時(shí),當(dāng)這個(gè)函數(shù)作為構(gòu)造函數(shù)被調(diào)用時(shí)其 this 值始終顯式綁定到指定的第一個(gè)參數(shù)。
舉一個(gè)例子:
var obj2 = { name: "李四" }; function sayHello( age) { console.log(this.name + "年齡是:" + age); } var helloBind = sayHello.bind(obj2); helloBind(18); // 輸出: 李四年齡是:18
在上面的例子中,我們使用bind()方法創(chuàng)建了一個(gè)新函數(shù)helloBind,其上下文是obj2對(duì)象。這里我們也可以給helloBind函數(shù)傳遞一個(gè)參數(shù)age,這個(gè)參數(shù)會(huì)在調(diào)用helloBind函數(shù)時(shí)使用。
可以看到,call()和bind()方法都是非常實(shí)用的JavaScript方法。如果我們需要向一個(gè)對(duì)象注入函數(shù)并且綁定它的執(zhí)行上下文,我們可以使用這兩個(gè)方法。它們都可以讓我們?cè)谶\(yùn)行時(shí)更改函數(shù)的執(zhí)行上下文,從而讓函數(shù)獲得一個(gè)新的this對(duì)象。