淺談js閉包

楚、發表於2018-06-24

一、作用域

    var x = 0  //全域性變數 x
    var y = 10 //全域性變數 y
    var fun1 = function(){
        var x = 1  //fun1函式區域性變數 x
        console.log(x++)
        console.log(y)
    } 
    fun1() //輸出 1  10 函式內可以訪問函式上級的變數
    console.log(x) //輸出0 函式外部不能呼叫函式內部的區域性變數

二、閉包

<!-- 閉包:有權訪問另一個函式作用域中的變數的函式。大多是在一個函式內部建立另一個函式 -->
    var x = 0  //全域性變數 x
    var fun1 = function(){
        var x = 1  //fun1函式區域性變數 x
        function fun2() {
            console.log(x++) //當x = 1時 x++ = x ; ++x = x+1
        }
        return fun2  //此時fun2就是一個閉包
    } 
    var run1 = fun1()
    run1() //輸出 1 
    run1() //輸出 2 run1是函式是引用型別,上一步執行run1將變數x改變進而影響這步的輸出

    var run2 = run1
    run2() //輸出 3  因為run2 = run1 run1和run2是函式屬於引用型別 所以共用一個作用域鏈
    run2() //輸出 4

    var run3 = fun1()
    run3() //輸出 1 這裡不是5 run3有自己的作用域鏈
    run3() //輸出 2

    console.log(x) //輸出 0