[TOC]
* * * * *
### 一、什么是函數(shù)
> 函數(shù)是由事件驅(qū)動(dòng)的或者當(dāng)它被調(diào)用時(shí)執(zhí)行的可重復(fù)使用的代碼塊。
- 語法
```JavaScript
function fun(arg1,arg2){
// 要執(zhí)行的代碼塊
}
```
- 調(diào)用方式
第一種:事件驅(qū)動(dòng)函數(shù)
```HTML
<button onClick="fun()">按鈕</button>
<script>
function fun(arg1,arg2){
// 要執(zhí)行的代碼塊
}
</script>
```
第二種:調(diào)用函數(shù)
```JavaScript
function fun(arg1,arg2){
// 要執(zhí)行的代碼塊
}
fun()
(function (arg1,arg2){
// 要執(zhí)行的代碼塊
})()
```
### 二、函數(shù)需要了解的知識(shí)
1. 作用域
作用域分為全局作用域和局部作用域
全局作用域:供所有代碼執(zhí)行的環(huán)境,只要瀏覽器不關(guān)閉就不會(huì)消失,也是最高的執(zhí)行環(huán)境,在該作用域下聲明的變量為全局變量
局部作用域:函數(shù)執(zhí)行的時(shí)候,開辟的用來解析函數(shù)體的代碼的新的棧內(nèi)存,它也叫做私有作用域,在該作用域下聲明的變量為局部變量
```JavaScript
//變量a就處于全局環(huán)境下,它是全局變量
var a = 1;
function fun(){ // 函數(shù)fun 處于全局環(huán)境下
var b = 2; //變量b就處于局部環(huán)境下,它是局部變量
var a = 3; //變量a就處于局部環(huán)境下,它是局部變量
}
```
2. 變量
js中使用var聲明的東西才是變量,但是需要注意的是:
```JavaScript
var b = 1;
c = 1
```
這里變量b和c的區(qū)別是:
- b是變量而c不是變量,要注意的是在全局環(huán)境下,變量b和c都會(huì)被js引擎添加到window下作為其屬性,如果在局部變量下,當(dāng)函數(shù)執(zhí)行后變量不會(huì)被添加到window對象上作為其屬性。
- 變量b會(huì)在程序初始化是提升(變量提升原則),而c不會(huì)。
```JavaScript
console.log(a) // a為underfind,因?yàn)閍變量初始化時(shí)被提升了
var a = 1;
console.log(a) // 1
```
### 三、函數(shù)聲明和函數(shù)表達(dá)式
1. 什么是函數(shù)聲明
> 有一個(gè)特定的名稱
> 在源碼中的位置:要么處于程序級(Program level),要么處于其它函數(shù)的主體>(FunctionBody)中
> 在進(jìn)入上下文階段創(chuàng)建
> 影響變量對象
以下面的方式聲明
```JavaScript
function fun(){
}
```
上邊的函數(shù)就是以函數(shù)聲明方式創(chuàng)建的,有一個(gè)特定的名稱fun,處于全局環(huán)境,在進(jìn)入上下文階段創(chuàng)建指的是程序開始運(yùn)行時(shí)優(yōu)先處理函數(shù)。影響變量對象可以看下面代碼:
```JavaScript
console.log(fun) // fun函數(shù),這里是因?yàn)楹瘮?shù)提優(yōu)先于同名變量提升(其實(shí)是覆蓋了變量對象中的同名變量)
var fun = 111;
console.log(fun) //111
function fun(){
}
console.log(fun) //fun 函數(shù)
var fun = 222;
console.log(fun) //222
```
2. 函數(shù)表達(dá)式
> 在源碼中須出現(xiàn)在表達(dá)式的位置
> 有可選的名稱
> 不會(huì)影響變量對象
> 在代碼執(zhí)行階段創(chuàng)建
最典型的就是匿名函數(shù):
```JavaScript
var fun = function (){}
```
函數(shù)表達(dá)式其實(shí)也可以擁有函數(shù)名的:
```JavaScript
!function fun(){} // 這也是函數(shù)表達(dá)式
```
所以說函數(shù)表達(dá)式和函數(shù)聲明最主要的判斷依據(jù)是,看看函數(shù)主體function 最前邊是否含有其它東西(主要指運(yùn)算符)。
例如常見表達(dá)式:
```JavaScript
+function fun(){
}
1,function fun(){
}
&function fun(){
}
(function(){})
var obj = {
fun:function(){}
}
```
### 四、立即自執(zhí)行函數(shù)
程序一運(yùn)行時(shí),函數(shù)會(huì)立即自己調(diào)用自己的函數(shù)。常見的立即自執(zhí)行函數(shù):
```JavaScript
(function(a){
console.log(a) // 1
})(1)
(function(a){
console.log(a) // 1
}(1))
```
自執(zhí)行函數(shù)還有沒有其他的寫法,其實(shí)是有的,我們只要知道立即自執(zhí)行函數(shù)是怎么自調(diào)的就可以寫出很多,他的特點(diǎn)就是小括號 `()` 左邊只要是函數(shù)表達(dá)式,它就可以立即自調(diào)。
例如:
```JavaScript
+function fun(a){
console.log(a) // 1
}(1)
1,function fun(a){
console.log(a) // 1
}(1)
&function fun(a){
onsole.log(a) // 1
}(1)
```
