javascript要點(上)

來源:互聯網
上載者:User

標籤:定義   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要點(上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.