美文网首页
js闭包、执行环境、作用域链

js闭包、执行环境、作用域链

作者: 牙牙and小尾巴 | 来源:发表于2019-06-06 16:59 被阅读0次

执行环境

执行环境:函数的运行环境

js的全局执行环境:window对象=》活动对象

1、每个函数都有一个执行环境,在函数执行时被创建,每个执行环境中包含一个变量对象(活动对象),执行环境中定义的所有变量和函数都保存在这个对象中。

2、函数执行时,函数的执行环境被创建后推入执行栈中,执行环境包含的活动对象被放入函数的作用域链中,

3、函数执行完毕,函数的执行环境被推出执行栈,执行环境被销毁。函数作用域链中对应的活动对象也被销毁。

作用域链:

每个函数都有一个自己的作用域链,它的作用域链决定了哪些数据能被函数访问

1、当一个函数创建后,它实际上定义和保存一个作用域链,这个作用域链是函数定义的时候创建的。
函数创建时的作用域链中包含的是一个全局对象(所有的全局变量和函数)。

2、函数执行时,会向作用域链中推入执行环境中的活动对象(即在函数内部定义的变量和函数以及参数集合)。
函数执行时,作用域链的前端始终都是当前执行的代码所在环境的变量对象。作用域链的末端始终都是全局执行环境的变量对象。

3、当函数执行完毕后,函数作用域链中对应的活动对象也被销毁。

闭包:

function outer(){
  var sky="blue";
  function inner(){
    console.log(sky);
  }

  return inner;
}
var result=outer();
result();    //"blue"

闭包是指有权访问另一个函数作用域中的变量的函数

1、所谓闭包,就是在函数outer内部定义了一个内部函数inner(inner可以访问函数outer的内部变量),并将inner函数return出去,使得外部环境可以通过inner访问outer的内部变量。

2、每个函数都有自己的执行环境和作用域链,当一个函数被执行时,它的执行环境就会被推入js的执行栈,其活动对象加入自己的作用域链中,一旦函数执行完,执行栈将其执行环境弹出,函数作用域链中的活动对象被销毁。

3、形成闭包的原因:函数outer执行完毕后,由于函数outer的内部函数inner被return出去后赋值给了一个全局变量,存在于全局作用域链的活动变量中,而inner又需要访问函数outer的内部变量。因此,函数outer作用域链中的活动对象没有被销毁(正常情况下,函数outer执行完毕后,其活动对象是应该被销毁的)

相关文章

  • js函数中的this

    前两篇文章“执行环境和作用域”和“js中的闭包”,我对谈了执行环境、作用域、作用域链和闭包的理解。但当牵涉到对象中...

  • 执行环境 & 作用域 & 闭包

    执行环境 & 作用域 & 闭包 执行环境 , 作用域 , 闭包 , 闭包应用 执行环境 执行环境定义了 当前环境的...

  • 闭包

    一、理解闭包前js基础1、作用域链(作用域、作用域链中有说)。2、js的内存回收机制。一个函数在执行开始的时候,会...

  • 执行上下文,词法作用域,作用域链,闭包

    执行上下文,词法作用域,作用域链,闭包

  • 《Web前端开发之JavaScript精英课堂》(六)

    对 作用域、作用域链、执行上下文对象(GO | AO)、闭包 的个人理解: JS分为全局和局部作用域,都属于词法作...

  • 闭包笔记

    闭包的定义 MDN 的定义: 闭包是函数和声明该函数的词法环境的组合。 词法作用域 参考作用域链: 函数在执行过程...

  • 3-1 作用域和闭包 执行上下文

    3-1 作用域和闭包 执行上下文 知识点 执行上下文 this 作用域 作用域链 闭包 执行上下文 先执行后定义

  • js闭包、执行环境、作用域链

    执行环境 执行环境:函数的运行环境 js的全局执行环境:window对象=》活动对象 1、每个函数都有一个执行环境...

  • 初识闭包

    闭包 闭包就是指有权访问另一个函数作用域中的变量的函数。在后台执行环境中,闭包的作用域链包含着它自己的作用域,包含...

  • js--闭包

    当在函数内部定义了其他函数时,就创建了闭包。 在后台执行环境中,闭包的作用域链包含着它自己的作用域、外部函数的作用...

网友评论

      本文标题:js闭包、执行环境、作用域链

      本文链接:https://www.haomeiwen.com/subject/cvuuxctx.html