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

    发恳写代码
  • 相关阅读:
    php require与include的区别
    php页面消耗内存过大处理办法
    flex if(a is b){},flex if(a as b){} 意思
    thinkphp的配置文件修改后不起作用
    ThinkPHP 入口文件定义 3.0 输出两次解决办法
    JS中的Math.ceil和Math.floor函数
    ThinkPHP 配置问题
    Google 快照无法使用时,如何恢复
    首页被收录了,但是只显示网址,处理办法
    RED5 端口使用
  • 原文地址:https://www.cnblogs.com/Mdh1991/p/5663509.html
Copyright © 2011-2022 走看看