国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解JavaScript函數(shù)綁定

2024-05-06 15:50:45
字體:
供稿:網(wǎng)友
在JavaScript與DOM交互中經(jīng)常需要使用函數(shù)綁定,定義一個函數(shù)然后將其綁定到特定DOM元素或集合的某個事件觸發(fā)程序上,綁定函數(shù)經(jīng)常和回調(diào)函數(shù)及事件處理程序一起使用,以便把函數(shù)作為變量傳遞的同時保留代碼執(zhí)行環(huán)境

復制代碼 代碼如下:


<body>

    <input 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è)計意圖是這樣的:當點擊按鈕的時候觸發(fā)該方法,彈出對話框顯示handler定義的message,然而點擊后對話框內(nèi)容卻是undefined。熟悉閉包的同學可以輕松看出來這個問題在于沒有保存handler.handlerFun()方法的執(zhí)行環(huán)境,this對象最后指向了DOM按鈕而非handler。可以使用閉包解決此問題,修改函數(shù)綁定語句

復制代碼 代碼如下:


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


這樣就可以得到預期的結(jié)果,這個解決方案在onclick程序內(nèi)部使用一個閉包直接調(diào)用handler.handlerFun()方法,當然這是特定于此場景的解決方案,創(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ù)。看起來很簡單,但是其功能很強大,在bing()中創(chuàng)建了一個閉包,閉包使用apply()調(diào)用傳入的函數(shù),并給apply()傳入執(zhí)行環(huán)境和參數(shù),這里的arguments是內(nèi)部匿名函數(shù)的,而非bind()的。當調(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)存開銷,所以盡量只在必要的時候使用。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 长武县| 乌海市| 凤阳县| 金沙县| 鹤岗市| 兰溪市| 翁牛特旗| 桐庐县| 安塞县| 龙南县| 太谷县| 九龙城区| 大埔县| 灵寿县| 宿州市| 连城县| 信宜市| 波密县| 子长县| 祥云县| 四川省| 松潘县| 靖边县| 遂昌县| 沈丘县| 友谊县| 阳曲县| 建昌县| 桦川县| 杭州市| 江川县| 大邑县| 青龙| 天镇县| 商都县| 桂平市| 吴旗县| 康定县| 仙游县| 宝清县| 白水县|