衆所周知,js是沒有塊級做用域這一說法的,js只有在函數中定義的變量纔是局部變量,定義在循環,條件語句中的都是全局變量,因此要實現模仿塊級做用域就須要利用js的這一特性,也就是利用閉包,實現局部變量外部沒法調用,只有特權方法才能實現閉包
參考高級程序設計一書,提供了兩種方法,分別使用於不一樣的場合:函數
一、利用構造函數自己:this
1 function Text(){ 2 var a = null; 3 var b =function(){ 4 alert(a); 5 }; 6 this.public = function(){ 7 return a ; 8 }; 9 this.publicset = function(value){ 10 a = value; 11 }; 12 } 13 14 var c = new Text(); 15 c.publicset("11"); 16 alert(c.public()); 17 18 var d = new Text(); 19 d.publicset("222"); 20 alert(c.public());
這裏的a與b分別是局部變量與函數,外部沒法直接調用,經過兩個特權方法進行調用。spa
這裏輸出了兩次c的name值,發現兩次值相同,覺得每新建一個實例,就有對應的一組屬性方法,每一次都是新建的,互不影響。prototype
二、靜態私有變量:設計
1 var text = (function(){ 2 var a = null; 3 var b = function(){ 4 return a ; 5 }; 6 7 var public = function(value){ //特權方法 8 }; 9 public.prototype.setName = function(value){ 10 a = value; 11 return this; 12 }; 13 public.prototype.getName = function(){ 14 return a; 15 }; 16 return public; //返回特權方法,返回給text 17 })(); 18 19 var c = new text(); 20 c.setName("ac"); 21 alert(c.getName()); //ac 22 23 var d = new text(); 24 d.setName("111"); 25 alert(c.getName()); //111
這裏採用了另外一種方法,在內部聲明瞭一個構造函數,並返回這個構造函數(書裏採用建立一個全局構造函數,直接在外部調用這個構造函數的方法),這個構造函數的原型定義特權函數,這樣全部的實例都使用這個特權方法,不會建立新的方法。code
兩次輸出的結果不一致,說明一個實例調用方法會影響其餘實例的靜態變量,這一點要注意。blog