欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript-闭包函数(理解)

程序员文章站 2022-05-14 12:08:24
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,
    ]
}

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