1. 程式人生 > >javascript閉包,作用域,自呼叫匿名函式

javascript閉包,作用域,自呼叫匿名函式

一,自呼叫匿名函式

有兩種方式:

       第一種: (function(引數){....}(傳入引數))    --->括號內的語句被強制執行

 第二種: (function(引數){...})(傳入引數)     --->說明:jquery就是採用這種方式,這種方式的原理:  原來我們呼叫函式的方式是,先定義,在進行函式名呼叫

        function funName(){
       alert("hello world");
        }
       funName(); //呼叫
        其原理是通過函式名(引用)去找實際的函式定義,  那麼我們這種自呼叫就很好理解了,是一定義函式就使用,而不是通過函式名去找定義
        即如果 你使用 (function(引數){...})的形式, 則相當於你定義了一個函式並執行了定義, 之後使用(引數),即是再進行自呼叫,即類似   函式名(引數) ,只不過這裡沒有函式名,而是變成函式定義實體,直接傳入引數即可
       

自呼叫匿名函式作用:    使內部變數不會與外部使用者自定義的全域性變數產生衝突,例如一個函式重名問題:如果不是自呼叫的函式,那麼必須有函式名,並且暴露給外部使用者呼叫,那麼就有可能產生函式重名問題:使用者的自定義了一個相同的函式名稱

自呼叫函式的形式研究: 在js中, "()"可以強制執行,第二種可以將函式括號換為其他型別, 例如-,+,new 等等,只要是能夠進行通順運算的(會把函式定義當成一個變數的方式執行起來)【-,+,new是可以直接放在變數前面的,如果是*則需要在*前加數字才通順 例如1*varName】




二,作用域:

物件變數

 1. 變數前有this:即this.varName的形式:公有變數,可以直接訪問
 2.物件前沒有this:私有變數或者全域性變數,,無法直接訪問


  1).私有變數:在物件內以var定義的變數, 如: var varName='xxxx', 不能直接訪問, 需要setter和getter函式訪問


  2). 全域性變數: 在物件外部的變數 或者 在函式內部直接使用變數名的形式,即沒有var或this的形式, 例如 varName="這是全域性變數", 這樣子就定義了一個全域性變數

全域性變數不能以 物件.變數的形式訪問, 但是可以直接以 變數名的形式訪問, 例如在程式中要訪問可以: alert(varName);即輸出"這是全域性變數"

成員函式


 1. 函式前加this: 即 this.functionName的形式:公共函式,可以直接訪問,setter和getter方法即用這樣定義


 2.物件前沒加this: 即function functionName(){}的形式,私有函式,只能在物件內部使用

成員函式如何訪問物件變數: 


  1,物件公共變數: 本身不用返回外部也可取到, 如果要訪問,使用this.varName(因為在物件中就是這樣定義的)


  2.全域性變數: 直接使用返回 varName的形式(因為本身就可以在任何地方使用 varName的形式)


  3.私有變數: 也是返回 varName的形式,不能使用this,this代表當前函式
三,閉包:

  function Person(){
  var i = 1;
 function functionName(){
   alert(++i);
 }
 return functionName;
}
var result = Person();
result();//得到2
result(); //得到3
說明:閉包:functionName稱為閉包,網上通俗解釋為 函式中的函式
我更願意理解為   物件中的函式,在作用域裡講過, 通過function functionName(){}的方式定義的是私有成員函式,只能給物件內部使用;
要是願意,完全可以將 return functionNname 的functionName 替換為原 functionName函式的定義,效果一樣
而在呼叫端, var result=Person(); 例項化物件(可以使用new Person()),result() 是呼叫物件,而例項化的物件只有一個,當然每呼叫一次i值就會增加

如果,例項化兩個物件,那麼其實兩個物件的i值是不會互相影響的

四,js原型,prototype<略>

通過 物件.prototype.XXX 可以給原有的物件 增加成員或者修改成員,(給物件進行擴充套件和修改),也是js中一個比較重要的知識點


掌握了上述的四個知識之後,就可以嘗試去看看JQuery庫的原始碼了,jquery通過自呼叫將jQuery【$】賦給window.jQuery,並在這個物件定義了很多成員和擴充套件,因此我們客戶端才可以直接通過 [window.]jQuery或$的方式使用JQuery庫和其裡面的方法