JS-函數(shù)讀書筆記

          1.函數(shù)就是對象
          函數(shù)可以存放變量,數(shù)組,對象
          函數(shù)可以當(dāng)做參數(shù)傳遞給其他函數(shù)
          函數(shù)可以返回函數(shù)
          函數(shù)可以擁有方法

          2.函數(shù)的調(diào)用
          調(diào)用運(yùn)算符是任何一個產(chǎn)生函數(shù)值的表達(dá)式之后的一對圓括號。
          調(diào)用一個函數(shù)將暫停當(dāng)前函數(shù)的執(zhí)行,傳遞控制權(quán)和參數(shù)給新函數(shù),除了聲明時定義的形參,每個函數(shù)接收兩個附加的參數(shù)-this和arguments。
          this的值取決于調(diào)用的模式:

          方法調(diào)用模式:函數(shù)被保存為對象的一個屬性時,稱為方法。方法被調(diào)用時,this綁定到該對象。
          var obj={
              value:0,
              increment:function(){
                  this.value+=1;
              }
          }
          obj.increment();
          obj.value;

          函數(shù)調(diào)用模式:當(dāng)一個函數(shù)并非對象的屬性時,它被當(dāng)作一個函數(shù)來調(diào)用,this綁定到全局對象(Window),因此不能共享外部函數(shù)對對象的訪問權(quán)-語言設(shè)計的錯誤。當(dāng)內(nèi)部函數(shù)被調(diào)用時,this應(yīng)該仍綁定到外部函數(shù)的this變量。
          解決方案:定義一個變量并給它賦值為this
          var myObj={
              value: 0,
              getValue: function(){
                  return this.value;
              }
          };
          myObj.test=function(){
              var that = this
              var helper=function(){
                  that.value+=1;
              }();
          }
          myObj.test();

          構(gòu)造器調(diào)用模式:如果一個函數(shù)前面帶上new來調(diào)用,將會創(chuàng)建一個隱藏連接到該函數(shù)的prototype成員的新對象,this將會綁定到新對象上。
          var Quo = function(string){
              this.status=string;
          }
          Quo.prototype.get_status=function(){
              return this.status;
          }

          var myQuo=new Quo("confused");
          myQuo.get_status();

          apply調(diào)用模式
          :apply方法讓我們構(gòu)建一個參數(shù)數(shù)組并用其去調(diào)用函數(shù)。該方法允許我們選擇this的值,apply方法接收兩個參數(shù),第一個就是將被綁定給this的值,如果是null則為Window對象,第二個是參數(shù)列表。
          var array=[3,4];
          var sum=add.apply(null,array);

          var Quo = function(string){
              this.status=string;
          }
          Quo.prototype.get_status=function(){
              return this.status;
          }
          var statusObj={
              status:"OK"
          };
          Quo.prototype.get_status.apply(statusObj);

          var myObj={
              add:function(a,b){
                  //參數(shù)為null或#ff0000,this引用為Window, double函數(shù)的alert證明了這一點(diǎn)
                  alert(this.location.href);
                  return a+b;
              }
          }
          var array=[3,4];
          var sum=myObj.add.apply(null,array);

          2.給類型增加方法:待續(xù)

          3.閉包-能夠讀/寫函數(shù)內(nèi)部的某些變量的子函數(shù),并將這些變量保存在內(nèi)存中.

          討論閉包之前先討論函數(shù)作用域
          1)函數(shù)內(nèi)的局部變量在函數(shù)外部無法訪問。
          function f(){
              var n=1;
          }
          alert(n);//error

          2)內(nèi)部函數(shù)可以訪問外部函數(shù)的局部變量。
          function f(){
              var n=1;
              function inner(){
                  alert(n);
              }
          }
          因此只要將inner作為返回值,就可以在f外部讀取它的內(nèi)部變量了。
          function f(){
              var n=1;
              function inner(){
                  alert(n);
              }
              return inner;
          }
          f()();
          閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。如果把父函數(shù)當(dāng)作對象使用,把閉包當(dāng)作它的公共函數(shù),把內(nèi)部變量當(dāng)作它的私有屬性。

          理解內(nèi)部函數(shù)能訪問外部函數(shù)的實(shí)際變量而無須復(fù)制:
          var add_handles=function(nodes){
              for(var i=0;i<nodes.length;i++){
                  nodes[i].onclick=function(e){
                      alert(i);
                  }
              }
          }

          var add_handles=function(nodes){
              for(var i=0;i<nodes.length;i++){
                  nodes[i].onclick=function(i){
                      return function(e){
                          alert(e);
                      }
                  }(i);
              }
          }


          閉包用途:
          1)讀取函數(shù)內(nèi)部的局部變量
          2)將變量的值始終保存在內(nèi)存中,因?yàn)閒是inner的父函數(shù),而inner被賦給了一個全局變量,導(dǎo)致inner始終在內(nèi)存中,而inner的存在依賴于f,因此f也始終在內(nèi)存中,不會在調(diào)用結(jié)束后被垃圾回收機(jī)制回收。
          3)通過保護(hù)變量的安全實(shí)現(xiàn)JS私有屬性和私有方法(不能被外部訪問)

          缺點(diǎn):閉包使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,不能濫用閉包。

          4.模塊
          一個定義了私有變量和函數(shù)的函數(shù),利用閉包創(chuàng)建可以訪問私有變量和函數(shù)的特權(quán)函數(shù),然后返回這個特權(quán)函數(shù)。
          提供接口卻隱藏狀態(tài)與實(shí)現(xiàn)的函數(shù)或?qū)ο蟆^饤壛巳肿兞俊?br />

          posted on 2011-02-21 14:38 *** 閱讀(361) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 沙田区| 大田县| 金湖县| 岳普湖县| 红河县| 平原县| 玉山县| 徐闻县| 青铜峡市| 祥云县| 凌云县| 新龙县| 喜德县| 炉霍县| 广州市| 石狮市| 揭西县| 武汉市| 永吉县| 承德市| 丹巴县| 依安县| 琼中| 江川县| 辉县市| 家居| 五华县| 伊宁县| 杭州市| 会理县| 隆化县| 信丰县| 封开县| 井研县| 南通市| 莱阳市| 建瓯市| 泗洪县| 安庆市| 郧西县| 庐江县|