1.變量作用域
變量的作用域:全局變量和局部變量霹购。
在JavaScript中:函數(shù)內(nèi)部可以直接讀取全局變量,但是在函數(shù)外部無(wú)法讀取函數(shù)內(nèi)部的局部變量朋腋。注意:在函數(shù)內(nèi)部聲明變量時(shí)厕鹃,要使用var命令。如果不用乍丈,實(shí)際上聲明的是一個(gè)全局變量剂碴!
2.全局作用域鏈
先看一個(gè)例子:
var a = 123;
fn(a);
function fn(a){
a = 456;
}
console.log(a); //123
運(yùn)行過程分析:
1.聲明變量a,并且賦值a=123轻专;
2.將a傳遞到fn(a)并且執(zhí)行function忆矛,在function內(nèi)的a賦值為456;
3.輸出a的值為123。
原理解釋:
var a = 123催训,是在全局作用域下聲明的洽议,與局部變量中的a并非同一個(gè)變量,function fn(a){ }中的a相當(dāng)于聲明了在局部作用域中的一個(gè)變量a漫拭,外部環(huán)境實(shí)際上是無(wú)法直接訪問內(nèi)部聲明的變量a的亚兄,所以位于全局作用域下的console.log(a)會(huì)去找全局作用域下聲明的a,即a = 123 采驻,所以最后輸出值為123审胚。
執(zhí)行邏輯:
每當(dāng)執(zhí)行一個(gè)函數(shù),就進(jìn)入了一個(gè)新的作用域下礼旅,找變量先從自己的作用域下找膳叨,如果找不到就到上一層(當(dāng)前函數(shù)聲明的作用域)的作用域下尋找,直到找到為止痘系。(如果在全局作用域下仍未找到菲嘴,就是undefined)
3.閉包的概念
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
代碼中的f2函數(shù),就是閉包汰翠。
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)龄坪。例如在javascript中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量复唤,所以閉包可以理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)“悉默。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的橋梁苟穆。(閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)抄课。)
4.函數(shù)的參數(shù)傳遞
function inc(n){
n++;
}
var a = 10雳旅;
inc(a);
console.log(a) //10
上面代碼相當(dāng)于:
function inc(n){
var n = arguments[0];
n++跟磨;
}
var a = 10;
inc(a);
console.log(a) //10
執(zhí)行步驟:
聲明一個(gè)變量n攒盈,值為arguments[0]抵拘,inc(a)即是將a的值傳遞給arguments,即function inc(){}里面的n = 10型豁,n++僵蛛,但是與a的值并無(wú)關(guān)聯(lián),所以a的值并未改變迎变,仍然是10充尉。