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