91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js如何實現函數綁定

發布時間:2022-03-22 09:24:22 來源:億速云 閱讀:482 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關js如何實現函數綁定的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

函數綁定

在javascript與DOM交互中經常需要使用函數綁定,定義一個函數然后將其綁定到特定DOM元素或集合的某個事件觸發程序上,綁定函數經常和回調函數及事件處理程序一起使用,以便把函數作為變量傳遞的同時保留代碼執行環境。

<button id="btn">按鈕</button>
<script>var handler = {
    message: "Event handled.",
    handlerFun: function() {
      alert(this.message);
    }
  };
  btn.onclick = handler.handlerFun;</script>

上面的代碼創建了一個叫做handler的對象。handler.handlerFun()方法被分配為一個DOM按鈕的事件處理程序。當按下該按鈕時,就調用該函數,顯示一個警告框。

雖然貌似警告框應該顯示Event handled,然而實際上顯示的是undefiend。這個問題在于沒有保存handler.handleClick()的環境,所以this對象最后是指向了DOM按鈕而非handler。

可以使用閉包來修正這個問題

<button id="btn">按鈕</button>
<script>var handler = {
    message: "Event handled.",
    handlerFun: function() {
      alert(this.message);
    }
  };
  btn.onclick = function() {
    handler.handlerFun();
  }</script>

當然這是特定于此場景的解決方案,創建多個閉包可能會令代碼難以理解和調試。更好的辦法是使用函數綁定。

一個簡單的綁定函數bind()接受一個函數和一個環境,并返回一個在給定環境中調用給定函數的函數,并且將所有參數原封不動傳遞過去。

function bind(fn, context) {
    return function() {
        return fn.apply(context, arguments);
    }
}

這個函數似乎簡單,但其功能是非常強大的。在bind()中創建了一個閉包,閉包使用apply()調用傳入的函數,并給apply()傳遞context對象和參數。當調用返回的函數時,它會在給定環境中執行被傳入的函數并給出所有參數。

<button id="btn">按鈕</button>
<script>function bind(fn, context) {
    return function() {
      return fn.apply(context, arguments);
    }
  }
  var handler = {
    message: "Event handled.",
    handlerFun: function() {
      alert(this.message);
    }
  };
  btn.onclick = bind(handler.handlerFun, handler);</script>

ECMAScript5為所有函數定義了一個原生的bind()方法,進一步簡化了操作。

只要是將某個函數指針以值的形式進行傳遞,同時該函數必須在特定環境中執行,被綁定函數的效用就突顯出來了。它們主要用于事件處理程序以及setTimeout()和setInterval()。

然而,被綁定函數與普通函數相比有更多的開銷,它們需要更多內存,同時也因為多重函數調用稍微慢一點,所以最好只在必要時使用。

感謝各位的閱讀!關于“js如何實現函數綁定”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

遵化市| 晋宁县| 上林县| 英吉沙县| 雷波县| 保靖县| 海兴县| 自贡市| 离岛区| 福安市| 云南省| 余江县| 新丰县| 南雄市| 衡阳市| 星子县| 隆安县| 当阳市| 贵溪市| 都昌县| 新河县| 鸡东县| 宜春市| 句容市| 延庆县| 子长县| 沙洋县| 东丽区| 东莞市| 建平县| 年辖:市辖区| 博罗县| 扬州市| 乌什县| 钟山县| 兴城市| 华安县| 图木舒克市| 临沂市| 罗平县| 关岭|