JavaScript基礎(chǔ)之函數(shù)與作用域

1、函數(shù)??
函數(shù):就是封裝了一段可被重復(fù)調(diào)用執(zhí)行的代碼塊。通過此代碼塊可以實現(xiàn)大量代碼的重復(fù)使用。
1.1、函數(shù)的使用??
函數(shù)在使用時分為兩步:聲明函數(shù)和調(diào)用函數(shù)
①聲明函數(shù)??
function?是聲明函數(shù)的關(guān)鍵字,必須小寫
由于函數(shù)一般是為了實現(xiàn)某個功能才定義的, 所以通常我們將函數(shù)名命名為動詞,比如?getSum
②調(diào)用函數(shù)??
調(diào)用的時候千萬不要忘記添加小括號
口訣:函數(shù)不調(diào)用,自己不執(zhí)行
注意:聲明函數(shù)本身并不會執(zhí)行代碼,只有調(diào)用函數(shù)時才會執(zhí)行函數(shù)體代碼。
1.2、函數(shù)的封裝
函數(shù)的封裝是把一個或者多個功能通過函數(shù)的方式封裝起來,對外只提供一個簡單的函數(shù)接口
1.3、函數(shù)的參數(shù)??
1.3.1、形參和實參??
在聲明函數(shù)時,可以在函數(shù)名稱后面的小括號中添加一些參數(shù),這些參數(shù)被稱為形參,而在調(diào)用該函數(shù)時,同樣也需要傳遞相應(yīng)的參數(shù),這些參數(shù)被稱為實參。

參數(shù)的作用?: 在函數(shù)內(nèi)部某些值不能固定,我們可以通過參數(shù)在調(diào)用函數(shù)時傳遞不同的值進(jìn)去
1.3.2、形參和實參個數(shù)不匹配??

注意:在JavaScript中,形參的默認(rèn)值是undefined
1.3.3、小結(jié)??
函數(shù)可以帶參數(shù)也可以不帶參數(shù)
聲明函數(shù)的時候,函數(shù)名括號里面的是形參,形參的默認(rèn)值為 undefined
調(diào)用函數(shù)的時候,函數(shù)名括號里面的是實參
多個參數(shù)中間用逗號分隔
形參的個數(shù)可以和實參個數(shù)不匹配,但是結(jié)果不可預(yù)計,我們盡量要匹配
1.4、函數(shù)的返回值??
1.4.1、return語句??
有的時候,我們會希望函數(shù)將值返回給調(diào)用者,此時通過使用 return 語句就可以實現(xiàn)。
return 語句的語法格式如下:
在使用 return 語句時,函數(shù)會停止執(zhí)行,并返回指定的值
如果函數(shù)沒有 return?,返回的值是?undefined
1.5、arguments的使用??
當(dāng)我們不確定有多少個參數(shù)傳遞的時候,可以用?arguments?來獲取。在 JavaScript 中,arguments 實際上它是當(dāng)前函數(shù)的一個內(nèi)置對象。所有函數(shù)都內(nèi)置了一個 arguments 對象,arguments 對象中存儲了傳遞的所有實參。
arguments存放的是傳遞過來的實參
arguments展示形式是一個偽數(shù)組,因此可以進(jìn)行遍歷。偽數(shù)組具有以下特點
①:具有 length 屬性
②:按索引方式儲存數(shù)據(jù)
③:不具有數(shù)組的 push , pop 等方法

2、作用域??
通常來說,一段程序代碼中所用到的名字并不總是有效和可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。作用域的使用提高了程序邏輯的局部性,增強(qiáng)了程序的可靠性,減少
2.1、全局作用域??
作用于所有代碼執(zhí)行的環(huán)境(整個 script 標(biāo)簽內(nèi)部)或者一個獨立的 js 文件
2.2、局部(函數(shù))作用域??
作用于函數(shù)內(nèi)的代碼環(huán)境,就是局部作用域。 因為跟函數(shù)有關(guān)系,所以也稱為函數(shù)作用域
2.3、JS 沒有塊級作用域??
塊作用域由?
{}
?包括在其他編程語言中(如 java、c#等),在 if 語句、循環(huán)語句中創(chuàng)建的變量,僅僅只能在本 if 語句、本循環(huán)語句中使用,如下面的Java代碼:
JS 中沒有塊級作用域(在ES6之前)

3、變量的作用域??
3.1、全局變量??
在全局作用域下聲明的變量叫做全局變量(在函數(shù)外部定義的變量)
全局變量在代碼的任何位置都可以使用
在全局作用域下?var?聲明的變量 是全局變量
特殊情況下,在函數(shù)內(nèi)不使用 var 聲明的變量也是全局變量(不建議使用)
3.2、局部變量??
在局部作用域下聲明的變量叫做局部變量(在函數(shù)內(nèi)部定義的變量)
局部變量只能在該函數(shù)內(nèi)部使用
在函數(shù)內(nèi)部 var 聲明的變量是局部變量
函數(shù)的形參實際上就是局部變量
3.3、區(qū)別??
全局變量:在任何一個地方都可以使用,只有在瀏覽器關(guān)閉時才會被銷毀,因此比較占內(nèi)存
局部變量:只在函數(shù)內(nèi)部使用,當(dāng)其所在的代碼塊被執(zhí)行時,會被初始化;當(dāng)代碼塊運行結(jié)束后,就會被銷毀,因此更節(jié)省內(nèi)存空間

4、作用域鏈??
只要是代碼,就至少有一個作用域
寫在函數(shù)內(nèi)部的叫局部作用域
如果函數(shù)中還有函數(shù),那么在這個作用域中就又可以誕生一個作用域
根據(jù)在內(nèi)部函數(shù)可以訪問外部函數(shù)變量的這種機(jī)制,用鏈?zhǔn)讲檎覜Q定哪些數(shù)據(jù)能被內(nèi)部函數(shù)訪問,就稱作作用域鏈
作用域鏈:采取就近原則的方式來查找變量最終的值。