最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JavaScript函數(shù)綁定

 更新時間:2013年08月18日 17:47:10   作者:  
在JavaScript與DOM交互中經(jīng)常需要使用函數(shù)綁定,定義一個函數(shù)然后將其綁定到特定DOM元素或集合的某個事件觸發(fā)程序上,綁定函數(shù)經(jīng)常和回調(diào)函數(shù)及事件處理程序一起使用,以便把函數(shù)作為變量傳遞的同時保留代碼執(zhí)行環(huán)境

復(fù)制代碼 代碼如下:

<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ù)綁定語句
復(fù)制代碼 代碼如下:

document.getElementById('btnTest').onclick=function(){
                handler.handlerFun();
            }

這樣就可以得到預(yù)期的結(jié)果,這個解決方案在onclick程序內(nèi)部使用一個閉包直接調(diào)用handler.handlerFun()方法,當(dāng)然這是特定于此場景的解決方案,創(chuàng)建多個閉包可能會令代碼難以理解和調(diào)試。


自定義bind函數(shù)

復(fù)制代碼 代碼如下:

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ù)。看起來很簡單,但是其功能很強大,在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)存開銷,所以盡量只在必要的時候使用。

相關(guān)文章

  • JavaScript的字符串方法匯總

    JavaScript的字符串方法匯總

    字符串的操作在js中非常頻繁,也非常重要。以往看完書之后都能記得非常清楚,但稍微隔一段時間不用,便會忘得差不多,記性不好是硬傷啊。。。今天就對字符串的一些常用操作做個整理,一者加深印象,二者方便今后溫習(xí)查閱。
    2016-07-07
  • 推薦10款擴展Web表單的JS插件

    推薦10款擴展Web表單的JS插件

    本篇文章給大家介紹了10款擴展Web表單的javascript的插件,一起跟著小編來學(xué)習(xí)下吧。
    2017-12-12
  • JavaScript DOM進階方法

    JavaScript DOM進階方法

    這篇文章主要介紹了JavaScript DOM進階,需要的朋友可以參考下
    2015-04-04
  • Redis基本知識、安裝、部署、配置筆記

    Redis基本知識、安裝、部署、配置筆記

    這篇文章主要介紹了Redis基本知識、安裝、部署、配置筆記,本文講解了基本知識、安裝Redis、Redis的配置等知識,需要的朋友可以參考下
    2015-03-03
  • JavaScript中splice的使用方法詳解

    JavaScript中splice的使用方法詳解

    這篇文章主要為大家詳細介紹了JavaScript中splice的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • input按鈕的事件處理大全

    input按鈕的事件處理大全

    input按鈕的事件處理大全,收集的是網(wǎng)頁中常用的一些事件處理,需要的朋友可以收藏下。
    2010-12-12
  • JavaScript中BOM和DOM詳解

    JavaScript中BOM和DOM詳解

    本文主要講解了JavaScript中BOM和DOM,BOM為瀏覽器對象模型,DOM 為文檔對象模型,兩者之間有很大的區(qū)別,感興趣的小伙伴可以閱讀一下這篇文章,了解相關(guān)內(nèi)容
    2021-08-08
  • JavaScript基礎(chǔ)之Array?forEach使用示例

    JavaScript基礎(chǔ)之Array?forEach使用示例

    這篇文章主要為大家介紹了JavaScript基礎(chǔ)之Array?forEach使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 輕松掌握JavaScript中的Math object數(shù)學(xué)對象

    輕松掌握JavaScript中的Math object數(shù)學(xué)對象

    Math對象或者說是類型旗下?lián)碛泻芏嗥綍r常用的數(shù)學(xué)函數(shù),雖然并不像Date和String那樣擁有類似于類和方法那樣的使用方式,不過并不妨礙您通過本文來輕松掌握JavaScript中的Math object數(shù)學(xué)對象^^
    2016-05-05
  • JavaScript中String.match()方法的使用詳解

    JavaScript中String.match()方法的使用詳解

    這篇文章主要介紹了JavaScript中String.match()方法的使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06

最新評論

保定市| 民勤县| 嘉义县| 宾阳县| 四会市| 岳阳县| 巴彦县| 东明县| 内黄县| 石河子市| 萨迦县| 武义县| 隆子县| 蛟河市| 香格里拉县| 杭锦旗| 来凤县| 北海市| 山丹县| 喀喇沁旗| 卓尼县| 深圳市| 长春市| 临西县| 汝城县| 清新县| 抚宁县| 广灵县| 博白县| 万源市| 麻栗坡县| 广饶县| 长岭县| 法库县| 遂平县| 三原县| 榆社县| 崇仁县| 铅山县| 芜湖县| 葫芦岛市|