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

首頁 > 編程 > JavaScript > 正文

善用事件代理,警惕閉包的性能陷阱。

2019-11-20 23:58:09
字體:
來源:轉載
供稿:網友
簡言之,閉包是產生一個沒有被釋放資源的棧區。換言之,就是一個不可控的內存空間占用,如果與事件相關聯,JS的垃圾回收機制也不會去觸碰該區域。
例如:我們有個項目需要實現在一個div中有上百個熱點區域(a標簽),類似淘寶店鋪廣告位自定義,那么按照傳統的做法,我們會如下做一個最典型的閉包使用的實例,目的是改變this的作用域,在其處理函數內部調用其他屬于該作用域的方法或屬性。
復制代碼 代碼如下:

var apply = function() {
  this.div = document.getElementById("div的id");
  this.hot = this.div.getElementsByTagName("a");
  for(var i=0; i<this.hot.length; i++) {
    this.hot[i].onclick = function(me) {
      return function() {
        me.edit(this);
      }
    }(this);
  }
}
apply.prototype = {
  edit: function(target) {
  }
}

這里產生的問題,就是每一次的循環,都會往內存當中寫入一個如上所描述的不可控的內存地址,當然,你找不到它,也沒辦法在不需要使用的時候清理它,js的回收機制也不知道他何時是無用的,產生垃圾地址。并且,當div內的dom結構發生改變的時候,你又需要重新去找到這些a標簽然后給他綁定事件。
當然你也可以把this添加到一個局部變量:var me = this; 至少如此是你可以控制的,你可以隨時的將局部變量me置為null,js的垃圾回收機制會知道何時去清理掉這些無用的數據。但是這樣也不是最好的解決方案,并且估計很多人也不會喜歡這種并不美觀的編碼方式。
最好的解決辦法,當然還是并不需要去關心那些內部的結構,也不為內部的任何一個元素申明任何一個變量,那么就是事件代理的工作。何謂事件代理,即不需要為每一個子對象綁定事件,通過冒泡機制找到當前觸發事件的元素,并通過你自己的一系列規則找到最終的處理函數。
如果使用事件代理的模式,該如何實現如上描述的需求?如下:
復制代碼 代碼如下:

var apply = function() {
  this.div = document.getElementById("div的id");
  this.div.onclick = function(me) {
    return function() {
      var _event = arguments.callee.caller.arguments[0];
      var target = _event.target || _event.srcElement;
      if(target.tagName == "a")
        me.edit(target);
      else
        return false;
    }
  }(this);
}
apply.prototype = {
  edit: function(target) {
  }
}

現在,我們只關心容器元素是何物,而不用關心他的內部有多少個a,他們是否發生改變等。性能的差別是顯然的。
10來分鐘隨便寫寫,有點混亂,希望對一些朋友有用,如有差錯之處,還望各位指點。

auntion / 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原創文章,轉載請留下此部分信息
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈巴河县| 玉树县| 萨嘎县| 昌平区| 华安县| 宝鸡市| 乌拉特后旗| 云和县| 郸城县| 江北区| 东山县| 五莲县| 信宜市| 广昌县| 克东县| 平遥县| 井冈山市| 稷山县| 民县| 本溪| 西青区| 松原市| 丹棱县| 钟山县| 隆化县| 满城县| 平塘县| 东城区| 阜康市| 乐安县| 宁波市| 禄劝| 三明市| 沙河市| 通榆县| 通州市| 保亭| 杨浦区| 金堂县| 那坡县| 阜阳市|