js:深入閉包(範圍:下)

來源:互聯網
上載者:User

function fn1(){
//建立了一個數組
var fns = new Array();
//i這個變數是儲存在fn1這個範圍中
for(var i=0;i<10;i++){
//數組中的值是一組函數
fns[i] = function(){
return i;
}
}
return fns;
}

var fs = fn1();
for(var i=0;i //此時通過閉包來調用所有的函數,當要輸出i的時候會在它所在的定義域(fn1)中找到它,
//此時它已變為10,所以連續輸出了10個10
console.log(fs[i]());
} //輸出:10

---------------------------解決方案------------------------------
function fn1(){
//建立了一個數組
var fns = new Array();
//i這個變數是儲存在fn1這個範圍中
for(var i=0;i<10;i++){
//num這個變數儲存在tf範圍,每一個閉包的num都是不一樣的
//所以此時所消耗的記憶體較大。
var tf = function(num){
fns[num] = function(){
return num;
}
}
tf(i);
}
return fns;
}

var fs = fn1();
for(var i=0;i //
console.log(fs[i]());
} //輸出:0 ~ 9

---------------------------塊範圍------------------------------
for(var i=0;i<10;i++){

}
//在js中沒有塊範圍,不管是使用迴圈還是判斷之後,這個變數一直存在
/**
* 所以當在全域使用某個變數進行迴圈或判斷之後,這個變數可能會影響到函數的變數,所以
* 所以在特殊情況下不要使用全域變數,而且全域變數在範圍鏈的最上層,訪問是最慢的。
*/
console.log(i);
function fn1(){
console.log(i);
}
fn1();

/**
* 在一個團隊進行開發中,可能會涉及到定義同名的全域變數,所以在開發中要養成一個好習慣:
* 將全域變數代碼放到一個匿名函數,並且馬上調用匿名函數,這樣也可以執行全域變數的代碼。
* 但是這些變數被控制在開發人員想要控制的範圍中。
*/
解決辦法:將塊範圍定義在一個匿名函數中。
(function(){
for(var i=0;i<10;i++){

}
})(); //在function的{}後不能直接調用,一定要加把匿名函數放在()內再執行。

---------------------------私人變數------------------------------
function Person(name){
/**
*此時沒有辦法直接存取name這個屬性,因為沒有this.name,
*要訪問name只能通過this.getName擷取,通過this.setName設定
*/
this.setName = function(value){
name = value;
}
this.getName = function(){
return name;
}
}

var p = new Person("zhang"); //zhang
console.log(p.getName());
p.setName("li");
console.log(p.getName()); //li

/**但是使用這種方式建立私人變數帶來的問題是每個對象要儲存大量函數。
* 解決的方法是通過靜態私人變數來解決。
*/
---------------------------解決方案------------------------------
var Person;
(function(){
//name在函數結束之後就消失,在外面無法使用
var name = "";
Person = function(value){
name = value;
}
Person.prototype.setName = function(value){
name = value;
}
Person.prototype.getName = function(){
return name;
}
})();

var p1 = new Person("aaa"); //aaa
console.log(p1.getName());
p1.setName("bbb"); //bbb
console.log(p1.getName());

原創文章如轉載,請註明出處,本文首發於csdn網站:http://blog.csdn.net/magneto7/article/details/25459099

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.