js:进一步关闭(范围:下一个)
function fn1(){
??//創(chuàng)建一個(gè)數(shù)組
??var fns = new Array();
??//i這個(gè)變量是保存在fn1這個(gè)作用域中
??for(var i=0;i<10;i++){
????//數(shù)組中的值是一組函數(shù)
????fns[i] = function(){
??????return i;?
????}?
??}
??return fns;
}
var fs = fn1();
for(var i=0;i<fs.length;i++){
??//此時(shí)通過(guò)閉包來(lái)調(diào)用全部的函數(shù),當(dāng)要輸出i的時(shí)候會(huì)在它所在的定義域(fn1)中找到它,
??//此時(shí)它已變?yōu)?0。所以連續(xù)輸出了10個(gè)10
??console.log(fs[i]());?
} //輸出:10
---------------------------解決方式------------------------------
function fn1(){
??//創(chuàng)建了一個(gè)數(shù)組
??var fns = new Array();
??//i這個(gè)變量是保存在fn1這個(gè)作用域中
??for(var i=0;i<10;i++){
????//num這個(gè)變量保存在tf作用域。每個(gè)閉包的num都是不一樣的
????//所以此時(shí)所消耗的內(nèi)存較大。
????var tf = function(num){
??????fns[num] = function(){
????????return num;?
??????}
????}
????tf(i);
??}
??return fns;
}
var fs = fn1();
for(var i=0;i<fs.length;i++){
??//
??console.log(fs[i]());?
} //輸出:0 ~ 9
---------------------------塊作用域------------------------------
for(var i=0;i<10;i++){
???
}
//在js中沒(méi)有塊作用域。無(wú)論是使用循環(huán)還是推斷之后,這個(gè)變量一直存在
/**
?* 所以當(dāng)在全局使用某個(gè)變量進(jìn)行循環(huán)或推斷之后,這個(gè)變量可能會(huì)影響到函數(shù)的變量,所以
?* 所以在特殊情況下不要使用全局變量。并且全局變量在作用域鏈的最上層。訪問(wèn)是最慢的。
?*/
console.log(i);
function fn1(){
??console.log(i);?
}
fn1();
/**
?* 在一個(gè)團(tuán)隊(duì)進(jìn)行開(kāi)發(fā)中,可能會(huì)涉及到定義同名的全局變量,所以在開(kāi)發(fā)中要養(yǎng)成一個(gè)好習(xí)慣:
?* 將全局變量代碼放到一個(gè)匿名函數(shù)。而且立即調(diào)用匿名函數(shù),這樣也能夠運(yùn)行全局變量的代碼。
?* 可是這些變量被控制在開(kāi)發(fā)者想要控制的作用域中。
?*/
解決的方法:將塊作用域定義在一個(gè)匿名函數(shù)中。
(function(){
??for(var i=0;i<10;i++){
???
??}??
})(); //在function的{}后不能直接調(diào)用。一定要加把匿名函數(shù)放在()內(nèi)再運(yùn)行。
---------------------------私有變量------------------------------
function Person(name){
??/**
?? *此時(shí)沒(méi)有辦法直接訪問(wèn)name這個(gè)屬性,由于沒(méi)有this.name,
?? *要訪問(wèn)name僅僅能通過(guò)this.getName獲取。通過(guò)this.setName設(shè)置
?? */
??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
/**可是使用這樣的方式創(chuàng)建私有變量帶來(lái)的問(wèn)題是每一個(gè)對(duì)象要存儲(chǔ)大量函數(shù)。
?* 解決辦法是通過(guò)靜態(tài)私有變量來(lái)解決。
?*/
---------------------------解決方式------------------------------
var Person;
(function(){
??//name在函數(shù)結(jié)束之后就消失,在外面無(wú)法使用
??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());
原創(chuàng)文章如轉(zhuǎn)載。請(qǐng)注明出處,本文首發(fā)于csdn站點(diǎn):http://blog.csdn.net/magneto7/article/details/25459099
版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的js:进一步关闭(范围:下一个)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++中构造函数 、析构函数的作用域详解
- 下一篇: 移动负载均衡技术(MBL)