javascript閉包,作用域,自呼叫匿名函式
阿新 • • 發佈:2019-01-24
一,自呼叫匿名函式
有兩種方式:
第一種: (function(引數){....}(傳入引數)) --->括號內的語句被強制執行第二種: (function(引數){...})(傳入引數) --->說明:jquery就是採用這種方式,這種方式的原理: 原來我們呼叫函式的方式是,先定義,在進行函式名呼叫
function funName(){alert("hello world");
}
funName(); //呼叫
其原理是通過函式名(引用)去找實際的函式定義, 那麼我們這種自呼叫就很好理解了,是一定義函式就使用,而不是通過函式名去找定義
即如果 你使用 (function(引數){...})的形式, 則相當於你定義了一個函式並執行了定義, 之後使用(引數),即是再進行自呼叫,即類似 函式名(引數) ,只不過這裡沒有函式名,而是變成函式定義實體,直接傳入引數即可
自呼叫匿名函式作用: 使內部變數不會與外部使用者自定義的全域性變數產生衝突,例如一個函式重名問題:如果不是自呼叫的函式,那麼必須有函式名,並且暴露給外部使用者呼叫,那麼就有可能產生函式重名問題:使用者的自定義了一個相同的函式名稱
二,作用域:
物件變數
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庫和其裡面的方法