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