JS的學習理解--->函式

如花姑娘發表於2019-07-20

函式 封裝功能塊

函式定義:
函式宣告
function f(引數1){ } function用來宣告函式 f為函式名 ()是函式的特殊標誌 函式表示式(相當於變數)
函式呼叫:
如果定義好一個函式,需要呼叫它,他才會執行函式體中的程式碼,若不呼叫,就相當於沒有定義該函式。
函式的引數:
形參:
函式定義時,()中寫的引數,叫形參,相當於函式內部的區域性變數,作用是用來接收實參。
function f(a,b){....}
實參:
函式呼叫時,()中寫的引數,叫實參,作用是給函式傳遞真實的資料,形參接收。
函式的返回值:
通過return返回,返回到函式的呼叫處。函式體中return後面的語句不會再執行。return也叫作跳轉語句。
命名法:
小駝峰命名法:toString()
大駝峰命名法:ToString()
下劃線命名法:to_String()
作用域:
全域性作用域
區域性作用域:函式內部會形成一個區域性作用域(函式作用域)
塊級作用域(let{})
引數的傳遞:
基本的資料型別傳遞(值傳遞)
把棧區的資料copy一份給了形參,形參和實參是個自獨立一個記憶體空間。
改變形參,對實參沒有影響。
引用資料型別的資料(引用傳遞)
就是把棧區的地址copy了一份給形參,形參和實參同時指向堆區同一片記憶體空間。
通過形參改變堆區記憶體空間的資料,實參這個地址對應的資料也會發生改變。
函式可以作為另一個函式的引數:
一個函式可以作為另一個函式的引數,這個函式可以是函式宣告也可以是函式表示式。
在JS,我們可以把一個函式宣告,作為別一個函式的引數
arguments:
函式呼叫過程就是實參向形參賦值的過程。實參會複製一份給形參。
除了複製給形參一份,他還會給arguments一份。
arguments中收集了實參。
arguments只是函式內部的屬性,在函式外不能訪問
arguments和形參之間一一對應:
當形參改變了,arguments裡面的值也會改變
當改變了arguments裡面的資料,形參也會發生改變
什麼時候使用形參,什麼時候使用arguments?
1,當實參非常多時,寫一堆的形參來接收,不方便,此時你就可以使用arguments
2,當實參有特殊含義時,需要有一個特殊的標識,就可以使用形參來標識
JS有兩個容器:
陣列:[1,2,3,"hello",true] 獲取某個元素時,使用索引
物件:{name:"zhangsan",age:100} name和age加Key zhangsan和100叫value
函式返回多個值:
預設情況下,Js函式只能返回一個值。
如果你想返回多個值的話,那麼你可以使用容器。
總結:
1. 函式的作用: 封裝成功能塊,用的時候直接呼叫
2. 函式的定義: 函式宣告 函式表示式
3. 函式的呼叫: 函式定義完後,沒有呼叫,相當於沒有寫 函式呼叫的過程就是實參向形參賦值的過程
4. 函式的返回值: return 如果沒有寫返回值,預設返回undefined
5. 函式的引數: 形參(函式定義是()裡面的引數)和實參(函式呼叫時()裡面的引數)
6. 引數的傳遞: 值傳遞,引用傳遞
7. 函式可以作為另一個函式的引數 setTimeout(function() {},3000)
8. arguments 收集實參
9. 返回時想返回多個值時,需要返回一個容器


ES6中對函式的擴充套件

引數的預設值:
1. 引數預設值 當我們沒有給形參傳值時,使用預設值,如果給形參傳值,使用我們傳遞的值。
2. 傳遞賦值時,實參的第一個會賦給形參的第一個,依次向後
3. 如果實參個數多於實參,後面的實參就忽略了
4. 如果形參個數多於實參個數,後面的形參的值是undefined
rest引數:
格式:在函式定義時的形參的位置寫的 ...rest (rest只是引數名,可以改變)
作用:當傳遞的實參個數較多時,接收多餘的實參

箭頭函式:
原型:function f(){...} ---------->let f = ()=>{...}省略了function
特點1:只有一個形參時,()可不寫

enter description here
特點2:只有一個帶return語句 {} 和 return 都可以不寫
enter description here
特點3:只有一個不帶return語句 {} 可以不寫
特點4:如果返回物件,把{} 和 return 省掉的話,需要給這個物件加()
enter description here
在箭頭函式中沒有arguments,可以使用rest引數
在箭頭函式中沒有this
------------------ 執行上下文
區域性程式碼:在函式裡面的程式碼叫區域性程式碼。
全域性程式碼:預設進入的就是全域性程式碼

全域性執行上下文,函式區域性程式碼:
當執行全域性程式碼時,產生一個全域性執行上下文。
全域性執行上下文只有一個。
當執行函式程式碼時,產生一個函式執行上下文。
每呼叫一次函式,都會產生一個函式的執行上下檔案。函式執行上下文可以有N個。

enter description here
執行上下文棧:
全域性執行上下文位於棧底,當呼叫一個函式,就產生一個區域性地執行上下文,這個區域性地執行上下文 要壓棧,當這個函式執行完,這個執行上下文就要出棧。
執行上下文的作用:
給全域性程式碼或區域性程式碼提供資料。資料包含變數和函式。
全域性執行上下文中組成: 全域性地變數和函式
區域性執行上下文中組成: 本函式內部的變數,arguments,內部定義的函式,父級函式的執行上下文

為什麼函式內部的變數,在函式的外部無法訪問,從執行上下文的角度來分析:

enter description here

作用域鏈:
作用域鏈是一種資料查詢機制,弄清楚作用域鏈,需要先知道執行上下文。
將函式定義到另一個函式內部:
某些函式,不想讓別人直接訪問,就可以把這個函式定義到另一個函式的內部,達到封裝效果。
函式可以作為返回值:
函式在js中也是一種資料型別,引用資料型別。引用資料型別:[] {} 函式
立即執行的函式表示式IIFE:
不需要我們手動地呼叫就可以執行的函式。
實現:()把整體包起來 ()把函式宣告包起來 + - * / !
IIFE最好在最後面加上分號;
閉包:
如果一個函式中,又巢狀了一個函式,並且這個函式引用外面函式的變數
當一個函式使用完畢後,它裡面的變數所佔的空間會被釋放
閉包可以延長變數的生命週期
閉包會產生記憶體洩漏

相關文章