JavaScript的函數(二)

JavaScript的函數之自執行函數和閉包

前面講到js函數的基本分類及使用,今天我們來聊一下自執行函數的原理以及簡單閉包原理。

1.自執行函數

說到自執行函數,其實就是函數不用被調用,自身執行代碼塊代碼。整體思路如下代碼:

1.按照我們的想法,先聲明一個匿名函數,然後在函數後面加上(),但是會發現報錯。如下圖:
在這裏插入圖片描述

按照上面的思路去理解,在匿名函數後面直接加上()應該是可以立即執行的,但這個函數報錯了,而且報了兩個錯誤,是因爲瀏覽器在解析js代碼的時候,遇到function會當做函數聲明,然後檢查語法,函數聲明必須要有函數名,所以報錯;第二個括號處的語法錯誤在於函數聲明到花括號處,就已經結束了,後面的()會被當作分組操作符,這個()實際上已經和函數聲明沒關係了,但是既然有了分組操作符,那就要有表達式,不然會報錯。

2順着錯誤原因修改,代碼如下:

    //首先給方法加上名字,同時在第二個()中加入表達式,如下:
    function func(){
        
    }(1)
    // 此時代碼不報錯了,但是上面函數並沒有立即執行,因爲前面已經說過了,函數聲明到{}末尾函數已經結束了,所以後面的()和函數沒有關係,所以繼續修改代碼如下:
    
    (function (){
        console.log("自執行函數");
    }())
    
    // 推薦此方法
    (function (){
        console.log("自執行函數1");
    })()
    //是指是在function前面加上任意的操作符,讓瀏覽器解析代碼時,不將 function 開頭的函數解析爲函數的聲明,如下:
    +function (){
        console.log("自執行函數2");
    }()

2.閉包

閉包就是能夠讀取其他函數內部變量的函數。因爲只有函數內部的子函數才能讀取局部變量,所以在本質上,閉包是函數內部和函數外部連接起來的橋樑。

簡單舉例如下:


    // 通常情況下,涉及到變量的作用域問題,函數外面是不可以獲取函數內部的變量的
    function func(){
        var num=10;
    }
    // 調用函數
    func();
    console.log(num);//num is not defined
    
    
    //通過閉包,可以在函數外面訪問函數內部的變量  
    function func1(){
        var num2=20;
        return function(){
            return num2;
        }
    }
    console.log(func1());//20
    

通過return,將函數作爲返回值返回,同時返回的函數中再返回函數func2內的變量,這是函數外面就可以獲取到函數內部的變量了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章