1. 程式人生 > >原型鏈、閉包、作用域

原型鏈、閉包、作用域

先看一段程式碼:

function a(){
    var n = 0;
    function inc() {
        n++;
        console.log(n);
    }
    inc();  
    inc(); 
}
a(); //控制檯輸出1,再輸出2

簡單吧。再來看一段程式碼:

function a(){
    var n = 0;
    this.inc = function () {
        n++; 
        console.log(n);
    };
}
var c = new a();
c.inc();    //控制檯輸出1
c.inc();    //控制檯輸出2

簡單吧

什麼是閉包?這就是閉包!

有權訪問另一個函式作用域內變數的函式都是閉包。

這裡 inc 函式訪問了建構函式 a 裡面的變數 n,所以形成了一個閉包。再來看一段程式碼:

function a(){
    var n = 0;
    function inc(){
       n++; 
       console.log(n);
    }
    return inc;
}
var c = a();
c();    //控制檯輸出1
c();    //控制檯輸出2

看看是怎麼執行的:

var c = a(),這一句 a()返回的是函式 inc,那這句等同於 var c = inc; 

c(),這一句等同於 inc();  注意,函式名只是一個標識(指向函式的指標),而()才是執行函式。

後面三句翻譯過來就是:  var c = inc;  a();  inc();,跟第一段程式碼有區別嗎? 沒有。