js的函式-function
阿新 • • 發佈:2021-01-16
## function函式
function的英文是[功能],[數] 函式;職責;盛大的集會的意思
在js裡,就是函式的意思。在Java裡叫做方法。
###定義函式
```
function fun(引數){
//函式體
//return可有可無,根據實際要求加或不加
}
```
###使用函式
```
//函式名()
fun();
```
**ps:**在js裡,我們的方法可以**先呼叫後宣告**,也就是呼叫寒素的程式碼可以寫在定義函式的前面。
###實參、形參
實參:簡單理解就是實際的引數,在呼叫函式的時候傳的
形參:簡單理解就是在定義函式時,用來接收呼叫時傳的值
```
var n1=123 , n2=456
//呼叫函式
fun(n1 , n2)
//定義函式
function fun( a , b){
a += 100
b += 100
console.log(a , b)
}
console.log(n1 , n2)
//執行結果:223 , 556
//123 , 456
```
ps:我們可以看出,實參和形參並不是同一個變數
### 不太嚴謹的引數列表
先看一段程式碼:
```
function fun(a , b , c){
console.log(a*10 , b+10 , c-10)
}
//呼叫
fun(1,2,3)//輸出結果10,12,-7
//這裡是沒毛病的,正常輸出
//但是下面這個呼叫呢???
fun(20,2)
fun()
fun(12,32,14,5)
```
ps:上面的寫法,都不會報錯...如果不信可以自己試試。
1. 我們在定義函式的時候,定義了多少個引數,按道理來說,就應該嚴格按照規範傳參,但是沒辦法,js裡比較‘寬容’,你傳了多少個引數,就接收多少個引數
2. 如果多傳了就無視你多傳的引數,從第一個','前的引數為第一個引數算
3. 如果少傳了,沒有傳的那幾個引數,就為undefined。都沒傳那就值都為**undefined**
### return關鍵字
首先,在js裡,並沒有規定函式在定義的時候,一定要有返回值或者返回值型別這一說法,很活躍的,你想返回什麼結果都可以
其次,如果要返回結果或者結束函式體,就要用到return關鍵字
1. return用於返回函式的值給呼叫者
2. return一旦執行,則立馬結束當前的函式,注意:**必須時返回具體的值才會結束**(可以思考一下遞迴呼叫)
3. return函式中可以有多個,返回不同條件下的值。比如在switch中,每個case後面可以用return返回具體的值
### arguments
在es5裡,arguments是一個物件,用來接收所有的引數,用法和陣列一致;不過目前**已被廢棄**,有更好的代替它
es6:(推薦使用)
```
function fun( n1, n2, ...args ){
//args只能接收n2後面的數
//用...接收的就是一個數組,可以遍歷
}
```
ps:...後面不一定要寫args,可以自己隨便命名,符合字串規範就行。一般用args表示
#### 關於...args的用法
1. **args不能放在引數列表的前面**
2. **args有且只有一個**
### 關於函式的耦合問題
先看程式碼:
```
var num = 100
var res = fun(1)
//定義函式
function fun(n){
console.log( num + n )
}
//輸出為101
```
**ps:**上面的程式碼執行結果沒問題,但是,**耦合度**很高,因為在函式體內,用全域性變數運算,這就很忌諱,如果專案要移植,這些用到的變數就會拖泥帶水的,耦合度高。這在以後的工作中這麼幹容易被**炒魷魚**...
**注意**:如果要使用,傳引數就好了,千萬別使用全域性變數
### 函式名的問題
```
var f = function fun(){
console.log("my name is rainbow")
}
console.log(f)
```
**ps**:我們把一個函式體,賦值給了一個變數,那麼這個變數打印出來會怎麼樣呢?
結果:並不會報錯,而是直接打印出了整個函式體的內容。我們可以這麼想,呼叫函式的時候,我們寫的是**fun()**,也就是 **函式名()** 就變成了呼叫了。其實,js裡面還真是這麼幹的,函式名加括號就是呼叫了一次函式。
**在這裡,大家和我想一個問題,這個方法體賦值給了變數,那這個變數是什麼型別呢**???
### 匿名函式
簡單理解就是,你要使用一個函式,但是這個函式沒有名字,這要怎麼使用呢。
很簡單,上面不是說了嗎?
- 呼叫函式就是 函式名()
- 而又因為 **函式名 = 方法體**
- 那麼 **方法體() = 函式名()**
這樣就呼叫了一次函式
```
var a = 10;
var b = 20;****************
var f = function(){
console.log(n1+n2)
};
f(a,b)//輸出結果30
```
### 自執行函式
- 自執行函式就是**自己定義自己執行**
這個就是匿名函式的應用
```
(function(){
console.log('this is rainbow !')
})();
例子
var a = 10;
var b = 20;
(function( n1 , n2 ) {
console.log( n2 + n1)
})(a ,b);
//輸出結果為30
```
**ps:**
- 自執行函式的函式體必須要用()包起來。建議最後加上分號';'
- 自執行應用場景一般在一些**類