閉包
閉包的三大特點(diǎn)為:
1、函數(shù)嵌套函數(shù)
2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量
3、參數(shù)和變量不會被回收。
列:
function test(){
? ? var a=1;
? ? return function(){
? ? ? alert(a);
? ? }
? }
? var try=test();
? try();//彈出a的值
這個例子中,變量a在test方法外部是無法訪問的,但test方法里面,嵌套了一個匿名函數(shù),通過return返回,test作用域中的變量a,
可以在匿名函數(shù)中訪問。并且當(dāng)test方法執(zhí)行后,變量a所占內(nèi)存并不會釋放,以達(dá)到嵌套的函數(shù)還可以訪問的目的。
閉包作用
閉包的作用在于,可以通過閉包,設(shè)計私有變量及方法。
舉例來說:在java中創(chuàng)建perosn類,含有私有變量name。
public class Person{
? ? private String name='wy';
? ? public Person(val){
? ? ? name=val;
? ? }
? ? public void setName(val){
? ? ? name=val;
? ? }
? ? public String getName(){
? ? ? return name;
? ? }
}
全局
最外層函數(shù)定義的變量擁有全局作用域,即對任何內(nèi)部函數(shù)來說,都是可以訪問的
列:
var outerVar = "outer";
? ? ? function fn(){
? ? ? ? console.log(outerVar);
? ? ? }
? ? ? fn();//result:outer
局部
和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問到,而對于函數(shù)外部是無法訪問的,最常見的例如函數(shù)內(nèi)部
列:
function fn(){
? ? ? ? var innerVar = "inner";
? ? ? }
? ? ? fn();
? ? ? console.log(innerVar);// ReferenceError: innerVar is not defined
作用域鏈
在JavaScript中,函數(shù)也是對象,實際上,JavaScript里一切都是對象。函數(shù)對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性。其中一個內(nèi)部屬性是[[Scope]],該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對象的集合,這個集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問。
列:
當(dāng)一個函數(shù)創(chuàng)建后,它實際上保存一個作用域鏈,并且作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。例如定義下面這樣一個函數(shù)
function func() {
? ? ? ? ? ? var num = 1;
? ? ? ? ? ? alert(num);
? ? ? ? }
? ? ? ? func();