詳解JavaScript函數(shù)綁定
<body>
<input id="btnTest" type="button" value="Button"/>
<script type="text/javascript">
var handler={
message:"Event handled.",
handlerFun:function(){
alert(this.message);
}
};
document.getElementById('btnTest').onclick=handler.handlerFun;
</script>
</body>
上面的例子創(chuàng)建了一個(gè)handler對(duì)象,handler.handlerFun()方法被分配為DOM按鈕的click事件處理程序。設(shè)計(jì)意圖是這樣的:當(dāng)點(diǎn)擊按鈕的時(shí)候觸發(fā)該方法,彈出對(duì)話框顯示handler定義的message,然而點(diǎn)擊后對(duì)話框內(nèi)容卻是undefined。熟悉閉包的同學(xué)可以輕松看出來這個(gè)問題在于沒有保存handler.handlerFun()方法的執(zhí)行環(huán)境,this對(duì)象最后指向了DOM按鈕而非handler??梢允褂瞄]包解決此問題,修改函數(shù)綁定語句
document.getElementById('btnTest').onclick=function(){
handler.handlerFun();
}
這樣就可以得到預(yù)期的結(jié)果,這個(gè)解決方案在onclick程序內(nèi)部使用一個(gè)閉包直接調(diào)用handler.handlerFun()方法,當(dāng)然這是特定于此場(chǎng)景的解決方案,創(chuàng)建多個(gè)閉包可能會(huì)令代碼難以理解和調(diào)試。
自定義bind函數(shù)
function bind(fn,context){
return function(){
return fn.apply(context,arguments);
};
}
document.getElementById('btnTest').onclick=bind(handler.handlerFun,handler);
通過自定義的bind函數(shù)可以將函數(shù)綁定到指定環(huán)境,bind()函數(shù)接收兩個(gè)參數(shù):一個(gè)綁定函數(shù),一個(gè)執(zhí)行環(huán)境,并返回一個(gè)在執(zhí)行環(huán)境中調(diào)用綁定函數(shù)的函數(shù)??雌饋砗芎?jiǎn)單,但是其功能很強(qiáng)大,在bing()中創(chuàng)建了一個(gè)閉包,閉包使用apply()調(diào)用傳入的函數(shù),并給apply()傳入執(zhí)行環(huán)境和參數(shù),這里的arguments是內(nèi)部匿名函數(shù)的,而非bind()的。當(dāng)調(diào)用返回的函數(shù)時(shí),它會(huì)在給定的函數(shù)中執(zhí)行被傳入的函數(shù),并給出所有參數(shù)。上面例子的調(diào)用handler.handlerFun依舊可以得到參數(shù)event,因?yàn)樗袇?shù)在都通過綁定的函數(shù)傳遞給它了。
小結(jié)
一旦要將某個(gè)函數(shù)以函數(shù)指針的形式傳遞,同時(shí)該函數(shù)必須在特定的環(huán)境中執(zhí)行,自定義的bind()函數(shù)就可以使用,他們主要用于事件處理程序及setTimeout和setInterval,然而這種綁定方式和普通函數(shù)相比需要更多的內(nèi)存開銷,所以盡量只在必要的時(shí)候使用。
- JavaScript 事件屬性綁定帶參數(shù)的函數(shù)
- JS 事件綁定函數(shù)代碼
- js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
- javascript中的綁定與解綁函數(shù)應(yīng)用示例
- JavaScript綁定事件監(jiān)聽函數(shù)的通用方法
- JavaScript為事件句柄綁定監(jiān)聽函數(shù)實(shí)例詳解
- 兼容瀏覽器的js事件綁定函數(shù)(詳解)
- 把多個(gè)JavaScript函數(shù)綁定到onload事件處理函數(shù)上的方法
- JavaScript函數(shù)中的this四種綁定形式
- JavaScript函數(shù)綁定用法實(shí)例分析
相關(guān)文章
javascript 繼承學(xué)習(xí)心得總結(jié)
下面小編就為大家?guī)硪黄猨avascript 繼承學(xué)習(xí)心得總結(jié)。小編覺得挺不錯(cuò)的。現(xiàn)在分享給大家。給大家做個(gè)參考2016-03-03簡(jiǎn)略說明Javascript中的= =(等于)與= = =(全等于)區(qū)別
本篇文章簡(jiǎn)略說明了Javascript中的= =(等于)與= = =(全等于)區(qū)別,有需要的朋友可以參考一下2013-04-04javascript中數(shù)組array及string的方法總結(jié)
本文結(jié)合自己的使用經(jīng)驗(yàn),給大家總結(jié)了javascript中數(shù)組array及string的使用方法,這里推薦給有需要的小伙伴。2014-11-11在JavaScript中處理字符串之fontcolor()方法的使用
這篇文章主要介紹了在JavaScript中處理字符串之fontcolor()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06HTML5實(shí)現(xiàn)留言和回復(fù)頁面樣式
這篇文章主要介紹了用HTML5如何實(shí)現(xiàn)留言和回復(fù)樣式,需要的朋友可以參考下2015-07-07移動(dòng)端自適應(yīng)flexible.js的使用方法(不用三大框架,僅寫一個(gè)單html頁面使用)推薦
這篇文章主要介紹了移動(dòng)端自適應(yīng)flexible.js使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04JavaScript數(shù)據(jù)類型相關(guān)知識(shí)詳解
這篇文章主要介紹了JavaScript數(shù)據(jù)類型相關(guān)知識(shí)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)js數(shù)據(jù)類型的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04