閉包和引用,this引用的簡單介紹……
          <script type="text/javascript">
          var a = "1";
          var b = a;
          b = "2";
          alert(a);
          //這里a是非對象,所以b = a 的時(shí)候,是把a(bǔ)引用的值拷貝了一份,然后直接給b,所以修改b的時(shí)候當(dāng)然不會改變a
          var a = {};
          a.name = "w";
          var b = a;
          b.name = "c";
          alert(a.name);
          /*
          這里a是對象,所以b = a 的時(shí)候,是把a(bǔ)的引用copy了一份,然后給b,又因?yàn)樾薷腷.name
          是通過b引用的對象,修改對象的成員,所以修改b.name的時(shí)候a也被修改了。。因?yàn)樗鼈兊囊孟嗤茨碂o知的對象。。
          但是如果你直接b = xxxx,這樣就不會影響到a的引用對象,因?yàn)閎的引用和a是一樣的,你只是把b的引用改變了,
          而不是通過b引用的對象去修改里面的成員。。。所以a的引用對象不會受到影響。。。

          */
          b = "wc";
          alert(a);
          /*
          下面介紹this的引用,this的引用是執(zhí)行的那個(gè)函數(shù) . 之前的對象比如。。。
          wc.func();
          這樣this的引用就指向wc
          如果是
          func();
          這種形式都可以認(rèn)為是window.func();
          所以它們的this的引用自然就是window;
          下面小段code
          */
          window.name = "window";
          var a = {};
          a.name = "a";
          a.func = function () {
              alert(this.name);
          };
          a.func(); //a
          var b = {};
          b.name = "b";
          b.func = a.func; //這里是把a(bǔ).func的那個(gè)函數(shù)的引用copy了一份給b.func
          b.func(); //b
          var c = a.func;
          c(); //window
          //關(guān)于引用的介紹到此:D
          </script>
          閉包:
          閉包其實(shí)就是執(zhí)行一個(gè)函數(shù)后,資源不會釋放。。。
          一般是函數(shù)里提供了一些資源,當(dāng)函數(shù)執(zhí)行完畢后,這些資源外面還會用到(函數(shù)之外存在引用)
          嗯,我堅(jiān)信code最有說服力。。。:D
          <script type="text/javascript">
          var a = function (i) {
              return function () {
                  alert(i);
              };
          };
          var b = a("內(nèi)容"); //這里i變量被保留了所以產(chǎn)生了閉包;
          alert(b);
          b(); //內(nèi)容
          //下面介紹下prototype.js里的bind方法
          Function.prototype.bind = function () {
          //綁定事件
              var wc = this, a = $A(arguments), o = a.shift();
              return function () {
                  wc.apply(o, a.concat($A(arguments)));
              };
          };
          /*
          $A方法,就是相當(dāng)于Array.call(null, arguments),注意arguments對象不是數(shù)組對象,只不過它有l(wèi)ength屬性和0-n屬性而已。。。
          又因?yàn)樗羞@些屬性,并且還可寫。。。所以可以用Array.call方法來改成數(shù)組
          其實(shí)就是等同于
          var $A = function () {
              for (var a = [], i = 0 ; i < arguments.length ; i ++) a[i] = arguments[i];
              return a;
          };
          var wc = this, a = $A(arguments), o = a.shift();
          這句就是把a(bǔ)rguments轉(zhuǎn)換成數(shù)組給a.
          var wc = this;
          因?yàn)檫@個(gè)是原型-prototype(關(guān)于原型后面會有文章介紹)下的方法,所以,所有函數(shù)對象都會被繼承。。。
          可以測試下面代碼:
          */
          Function.prototype.wc = function () {
              alert(this);
          };
          var f = function () {
              alert(1);
          };
          f.wc(); //function () { alert(1); }
          //即

          Function.prototype.wc = function () {
              var wc = this;
              return function () {
                  alert(wc);
              };
          };
          var n = f.wc();
          n(); //function () { alert(1); }
          /*
          wc.apply(o, a.concat($A(arguments)));
          */
          </script>


          下面展示一個(gè)很簡單的閉包實(shí)例:
          (以AJAX取的JSON數(shù)據(jù)后,生成表格,并在相應(yīng)的td位置上增加onclick事件)
          var td_0 = document.createElement('td');
          td_0.innerHTML = _json[i]["group_name"]; 
          td_0.onclick = function (_i)
              {
               return function ()
               {
                getMember(_json[_i]["group_id"]);
               };
              }(i );

          posted on 2007-12-23 23:57 -274°C 閱讀(772) 評論(3)  編輯  收藏 所屬分類: web前端


          FeedBack:
          # re: JAVASCRIPT 與閉包[未登錄]
          2009-07-17 13:23 | test
          <script type="text/javascript">


          var a = function(_i)
          {
          return function()
          {
          alert(_i);
          }

          };

          a(10)();

          var b = function()
          {
          return function(_i)
          {
          alert(_i);
          }

          };

          b()(10);

          </script>  回復(fù)  更多評論
            
          # re: JAVASCRIPT 與閉包
          2009-07-23 09:35 | java-he
          循環(huán)給元素添加事件的方法除了上面的閉包,還有一種巧妙的方法。比如
          for(var i=1; i < 4; i++){
          var id = document.getElementById("a" + i);
          id.i=i;//這個(gè)i有了根
          id.onclick=function(){
          alert(this.i)
          };
          };
            回復(fù)  更多評論
            
          # re: JAVASCRIPT 與閉包
          2009-10-27 01:59 | -274°C
          根據(jù)《JavaScript 內(nèi)存泄露》
          (http://www.aygfsteel.com/JAVA-HE/archive/2009/10/27/299856.html)
          這里總結(jié),上面方法是有內(nèi)存泄露的。  回復(fù)  更多評論
            

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 914173
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 四子王旗| 武汉市| 灯塔市| 青龙| 包头市| 桑日县| 五河县| 彩票| 万载县| 游戏| 织金县| 枣强县| 南丰县| 博罗县| 绥德县| 孝义市| 通化市| 泉州市| 宜城市| 宜宾县| 九龙县| 都兰县| 阿巴嘎旗| 涪陵区| 宜城市| 大余县| 江门市| 新泰市| 延津县| 绍兴县| 行唐县| 遵义县| 太和县| 达日县| 沂源县| 佛坪县| 德惠市| 枣阳市| 阿勒泰市| 岱山县| 靖安县|