標籤:定義 get style rod 執行函數 非同步 dimens 為什麼 不能
立即執行函數
即Immediately Invoked Function Expression (IIFE),正如它的名字,就是建立函數的同時立即執行。它沒有綁定任何事件,也無需等待任何非同步作業:
(function () { console.log("js")})()
function(){…}是一個匿名函數,包圍它的一對括弧將其轉換為一個運算式,緊跟其後的一對括弧調用了這個函數。立即執行函數也可以理解為立即調用一個匿名函數。立即執行函數最常見的應用情境就是:將var變數的範圍限制於你們函數內,這樣可以避免命名衝突。
閉包
對於閉包(closure),當外部函數返回之後,內建函式依然可以訪問外部函數的變數。下面是一個比較經典的例子
function f1(){ var N = 0; // N是f1函數的局部變數 function f2() // f2是f1函數的內建函式,是閉包 { N += 1; // 內建函式f2中使用了外部函數f1中的變數N console.log(N); } return f2;}var result = f1();result(); // 輸出1result(); // 輸出2
代碼中,外部函數f1只執行了一次,變數N設為0,並將內建函式f2賦值給了變數result。由於外部函數f1已經執行完畢,其內部變數N應該在記憶體中被清除,然而事實並不是這樣:我們每次調用result的時候,發現變數N一直在記憶體中,並且在累加。為什麼呢?這就是閉包的神奇之處了!
閉包定義私人變數
JavaScript開發人員使用底線作為私人變數的首碼。但是實際上,這些變數依然可以被訪問和修改,並非真正的私人變數。這時,使用閉包可以定義真正的私人變數:
function Product() { var name; this.setName = function(value) { name = value; }; this.getName = function() { return name; };}var p = new Product();p.setName("Fundebug");console.log(p.name); // 輸出undefinedconsole.log(p.getName()); // 輸出Fundebug
代碼中,對象p的的name屬性為私人屬性,使用p.name不能直接存取。
prototype
每個JavaScript建構函式都有一個prototype屬性,用於設定所有執行個體對象需要共用的屬性和方法。prototype屬性不能列舉。JavaScript僅支援通過prototype屬性進行繼承屬性和方法。
function Rectangle(x, y){ this._length = x; this._breadth = y;}Rectangle.prototype.getDimensions = function(){ return { length: this._length, breadth: this._breadth };};var x = new Rectangle(3, 4);var y = new Rectangle(4, 3);console.log(x.getDimensions()); // { length: 3, breadth: 4 }console.log(y.getDimensions()); // { length: 4, breadth: 3 }
代碼中,x和y都是建構函式Rectangle建立的對象執行個體,它們通過prototype繼承了getDimensions方法。
模組化
JavaScript並非模組化程式設計語言,至少ES6落地之前都不是。然而對於一個複雜的Web應用,模組化編程是一個最基本的要求。這時,可以使用立即執行函數來實現模組化,正如很多JS庫比如jQuery以及我們Fundebug都是這樣實現的。
var module = (function() { var N = 5; function print(x) { console.log("The result is: " + x); } function add(a) { var x = a + N; print(x); } return { description: "This is description", add: add };})();console.log(module.description); // 輸出"this is description" module.add(5); // 輸出“The result is: 10”
所謂模組化,就是根據需要控制模組內屬性與方法的可訪問性,即私人或者公開。在代碼中,module為一個獨立的模組,N為其私人屬性,print為其私人方法,decription為其公有屬性,add為其共有方法。這在很多公司都有公用的庫裡面存放很多封裝好的方法功能,用起來爽爽的!
javascript要點(上)