Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

闭包及闭包的意义 #16

Open
lxinr opened this issue Apr 24, 2019 · 1 comment
Open

闭包及闭包的意义 #16

lxinr opened this issue Apr 24, 2019 · 1 comment

Comments

@lxinr
Copy link
Owner

lxinr commented Apr 24, 2019

概念

闭包是函数和声明该函数的词法环境的组合,这个环境包含了这个闭包创建时所能访问的所有局部变量。这样就可以在外部间接使用内部的局部变量。简而言之:闭包通过形成一个包含了局部变量的词法环境的形式,使得外部也可以间接使用内部的变量

意义

1、封装私有变量

2、模仿块级作用域(ES5中没有块级作用域)

3、实现JS的模块

@lxinr
Copy link
Owner Author

lxinr commented Jan 28, 2021

指内部函数总是可以访问其所在的外部函数中声明的变量和参数

  • 所有的函数在“诞生”时都会记住创建它们的词法环境,所有函数都有名为 [[Environment]] 的隐藏属性
  • [[Environment]] 属性保存了对创建该函数的词法环境的引用,与函数被在哪儿调用无关,[[Environment]] 引用在函数创建时被设置并永久保存
  • 在调用函数时,它会先找自己的词法环境,然后再往它创建的位置之外搜索词法环境
function f() {
  let value = 123;
  return function() {
    alert(value);
  }
}
let g = f(); // g.[[Environment]] 存储了对相应 f() 调用的词法环境的引用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant