1. 程式人生 > >JavaScript-函式學習總結

JavaScript-函式學習總結

 

1、定義:程式中封裝一項任務的步驟清單的程式碼段,再起一個任務名

                函式是一個引用型別的物件

     物件:記憶體中一塊同時儲存多個值的空間

    何時使用:發現一項任務會被反覆呼叫,要先將任務步驟封裝為一個函式,再反覆呼叫。

    如何宣告函式:

        function 任務名([引數變數列表]){

            步驟清單程式碼段;

            [return 返回值];

        }

    如何呼叫函式:函式名([引數值列表]);

    強調:1、函式只有在呼叫時,才會執行!

              2、函式可被反覆呼叫!——程式碼重用(提高複用性,便於維護,一次定義處處可用,一次修改處處生效。。。)

    引數變數:專門接收方法執行所必須的資料的變數

    何時使用:如果一個函式,必須提供指定資料,才能正常執行時,

                      需要提供幾個資料,就定義幾個引數接收

    如何使用引數:無需var,直接在函式名後的括號中定義引數名,每個引數名用逗號分隔;

    何時,如何傳入引數值:呼叫時,按照引數定義的個數和順序傳入

    為什麼使用引數:引數可以讓方法變得更靈活;

2、記憶體中函式生命週期(函式執行過程):

    1、定義時:將函式直接封裝在一個物件中儲存

                        函式名,其實是指向物件的一個變數

                        定義時,不會讀取函式的內容(所以就算函式體中有錯誤,也不會報錯,不會影響函式之後的內容執行)

    2、呼叫時:在執行環境中增加一個當前函式的執行環境物件

                    才會逐行讀取並執行函式的內容

    3、呼叫後:函式的執行環境彈出,活動物件被釋放,記憶體中又恢復到定義時的樣子

圖1-1函式執行時的大概過程

    

                                                               圖 1-2 定義時和呼叫後

                                                                    圖1-3函式執行過程                                           

3、作用域:一個變數的可用範圍

                    本質其實是一個儲存多個變數的物件

    2種:1、全域性作用域:專門儲存全域性變數的物件

                    全域性變數:在任何時候任何位置都可被訪問

             2、函式作用域:專門儲存函式內部的區域性變數的物件

                                                    ——活動物件

                    區域性變數:2類:1、所有的引數變數

                                              2、在函式內部宣告(var出來)的變數

                                                      只在函式呼叫時函式內部才可用

概念解釋:

活動物件:專門儲存*本次*函式呼叫時需要的所有資料的物件。

頁面剛載入時:會有一個執行環境棧(ECS) ,ECS 中只有一個全域性(EC)元素

                     全域性 EC 引用 window 物件

 宣告時: 首選建立函式物件: 專門儲存函式定義的空間 ---函式名指向這個函式物件

函式呼叫時,執行環境棧(ECS)中會壓入一個函式執行環境 EC ,同時函式執行環境 EC為本次函式呼叫建立活動物件 AO  呼叫時自動建立,呼叫後自動釋放。 

呼叫時: 使用*當前引擎所在的 EC*中的變數,執行函式體中的步驟清單。

 呼叫後: 本地函式呼叫的 EC 出棧->活動物件 AO 釋放

4、返回值:函式呼叫的執行結果

    何時使用:只要函式的執行,需要有明確的返回結果時,要看呼叫者是否需要獲得執行結果;

                    (定義幾個引數,起什麼函式名看誰:看函式定義本身需要不需要)

    何時如何獲得返回值:呼叫時:

                                        var 變數=函式名(xx)

                    返回值只能是一個值不能是多個

5、***按值傳遞:兩變數間賦值或向函式中傳遞引數時,

                            都是將原變數中的值複製一個副本給對方

                            修改一方,另一方不受影響

6、***宣告提前:在正式執行程式之前,都會先預讀所有var 宣告的變數function宣告的函式,集中到當前作用域的頂部集中宣告,賦值留在原地

7.定義函式的第二種方法:

    var  函式名= function(引數){函式體;return 返回值}

VS 宣告函式

    第二種方法,函式定義不會提前,僅函式名提前

    宣告函式,整體(函式名+函式定義)提前

總結一:如果一個表示式或函式有結果,就可直接當一個值用