zoukankan      html  css  js  c++  java
  • JavaScript-闭包函数(理解)

    JavaScript-闭包函数(理解)

    var foo = function (a) {
        return function inner  ()  {
            console.log(a)
        }
    }
    
    
    var faa = foo(1)
    
    /*
    fooContext = {
        variableObejct:{
            inner:[对函数声明inner的引用]
    	    arg:1
        }
        this: thisValue,
        Scope:[
        	 globalContext.variableObject   // 就是全局变量
        ]
    }
    
    innerContext = {
        variableObejct:{
        }
        this: thisValue,
        Scope:[
        	 fooContext.variableObject      // foo的变量
        	 globalContext.variableObject   // 就是全局变量
        ]
    }
    
    这是你原文的一段话:
    实际上,foo函数调用结束后, foo函数的变量对象并不会被立即销毁,而是只有当取得foo函数闭包的值的foo1, foo2, foo3调用结束, 这三个函数的变量对象和作用域链被销毁后, foo函数才算“完成任务”,这时,它才能被销毁。
    
    我是不是可以这样理解:
    innerContext中的Scope里还有对 fooContext.variableObject 的引用吧,所以此时foo是不会删除的,只有当inner这个闭包函数被调用完之后,inner这个作用域被删除之后,fooContext.variableObject没有其他被引用了,这时也就会删除掉foo的作用域
    
    */
    

    关于闭包先了解函数执行环境,作用域链以及变量对象

    在函数调用的时候,会创建一个函数的执行环境,这个执行环境有一个与之对象的变量对象和作用域链

    ExecutionContext = {
        variableObject: { .... },
        this: thisValue,
        Scope: [ // Scope chain
          // 所有变量对象的列表     ]
    };
    

    变量对象和作用域链

    var foo = function (a) {
        var name = "zhuyu"
        var inner = function () {
            console.log(a)
        }
        return inner
    }
    
    foo(222)
    
    // 上面这个函数调用的时候,它的执行环境的变量对象就是variableObject里的数据
    // 它的作用域链就是Scope里的数据
    fooexectionContext = {
        variableObject:{
            name:"zhuyu",
            inner:[函数inner的引用],
            arg:222
        }
        Scope:[
            fooexectionContext.variableObject,
            gobleExectionContext.variableObjet,
        ]
    }
    

    上面这个例子只是返回了一个闭包函数,就调用了一次函数

  • 相关阅读:
    The AndroidManifest.xml File
    handlebars简单用法
    高性能跨语言模板引擎Crox
    C++17 新特性
    C++ 14新特性
    [lua]笔记
    [lua]笔记
    delphi关键字
    delphi 基础
    TCP/UDP
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/10777711.html
Copyright © 2011-2022 走看看