浅谈js闭包

一.作用域

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

你可能感兴趣的:(浅谈js闭包)