zoukankan      html  css  js  c++  java
  • JS闭包

    作用域

    • js只有函数作用域没有块作用域
    • js函数内部可以直接读取全局变量
    • 内部函数可以访问外部函数的变量,外部函数无法访问内部函数的局部作用域
    var a = 100;
    function fn(){
        console.log(a)// 100
    }
    
    function fn2(){
        var b = 200;
        function fn3(){
            console.log(b)// 200
        }
    }
    
    function fn3() {
        var c = 300;
    }
    console.log(c)// undefined
    

    问题

    • 如何在函数外部读取函数内部的局部作用域
    function fn4() {
        var d = 400;
        return function() {
            console.log(d)
        }
    }
    var temp = fn4();
    temp();// 400
    

    闭包定义

    • 闭包就是能够读取其它函数内部变量的函数
    • 由于js中只有函数内部的子函数才能读取局部变量,所以闭包可以认为是‘定义在一个函数内部的函数’

    闭包的作用

    • 读取函数内部的变量
    • 让这些局部变量始终保存在内存中
    var gtemp = null;
    function fn5(){
        var n = 1;
        gtemp = function(){
            n += 1;
        }
        return function(){
            console.log(n)
        }
    }
    var temp = fn5();
    temp();// 2
    gtemp();
    temp();// 3
    

    注意:第一次调用temp自加1
    调用gtemp()方法自加1
    在次调用temp方法时n并没有在fn5调用完释放,而是继续自加1
    fn5内部匿名函数赋值给全局变量,匿名函数无法释放,因为匿名函数的存在依赖于fn5函数,所以fn5也始终在内存中不会在调用完后被gc

    var gv = 'the window'
    var objects = {
        gv: 'the name',
        objFun: function(){
            return function(){
                return this.gv;
            }
        }
    }
    console.log(objects.objFun())// the window
    
    var gv = 'the window'
    var objects = {
        gv: 'the name',
        objFun: function(){
            var self = this;
            return function(){
                return self.gv;
            }
        }
    }
    console.log(objects.objFun())// the name
    

    闭包的概念

    当内部函数 在定义它的作用域(js中只有函数作用域)的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们.

    发恳写代码
  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    HDU
    P6146 [USACO20FEB]Help Yourself G 组合数学 DP
    CodeForces
    POJ
    【网络学习】集线器,交换机,路由器的作用
    【Python学习】深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/Mdh1991/p/5663509.html
Copyright © 2011-2022 走看看