mengjoy / bugCheck

主要用来记录写项目中遇到的问题
0 stars 0 forks source link

闭包 #25

Open mengjoy opened 3 years ago

mengjoy commented 3 years ago

来自MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures 来自博客:https://limeii.github.io/2019/05/js-execution-context/ 相关知识:

1.词法分析 登记变量声明,函数声明,函数声明。

2.词法环境 词法分析登记的地方就是词法环境 词法环境有两个部分,环境记录【声明式环境记录,对象式环境记录】和对外部词法环境的引用 词法环境实在代码定义时决定的,和代码在哪里调用没关系。所以js的词法作用域是静态作用域。

3.作用域链 沿着词法环境到找变量的值就是作用域链。

  1. 变量提升&函数提升 v8引擎执行代码三步骤,先做分词和词法分析,然后解析ast【语法抽象树】,最后生成机器码执行代码。 词法分析的时候会生成词法环境登记变量。

var c function functionDec() { console.log(c) c = 30; } functionDec();

5.执行上下文 每次执行回调函数时会把方法以执行上下文的方式压入执行栈,执行完以后会被弹出执行栈。 可执行代码包含四种,global,function,module,eval。执行上下文有三个部分组成,词法环境【LexicalEnvironment】,this,还有一个和词法环境指向同一个词法环境的环境【VariableEnvironment】。 代码执行步骤:

ve的环境使用登记var function变量声明,le是用来登记let const class的变量声明的。 function updown() { let a = 1; let b = 2; { let c = 3 function down() { console.log('down') } } down()// 可以调用 // console.log(c) // 报错 } updown()

6.this指向 this指向和执行环境有关 严格模式下,在function里的this指向是undefined,若是this没有被传进来。 全局的this指向window 箭头函数的this,在调用时不会绑定this。也不会去词法环境链上寻找this,this取决于它定义的位置

window.a = 10 const foo = () => { console.log(this.a) } foo.call({a: 20}) // 10

let obj = { a: 20, foo: foo } obj.foo() //10

function bar() { foo() } bar.call({a: 20}) //10

7.闭包 闭包就是执行完上下文被弹出执行栈,但是在这种情况下,还保留对词法环境的引用,通过这个引用访问失联的词法环境,这个引用就是闭包。