Open mengjoy opened 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.作用域链 沿着词法环境到找变量的值就是作用域链。
var c function functionDec() { console.log(c) c = 30; } functionDec();
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()
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.闭包 闭包就是执行完上下文被弹出执行栈,但是在这种情况下,还保留对词法环境的引用,通过这个引用访问失联的词法环境,这个引用就是闭包。
来自MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures 来自博客:https://limeii.github.io/2019/05/js-execution-context/ 相关知识:
1.词法分析 登记变量声明,函数声明,函数声明。
2.词法环境 词法分析登记的地方就是词法环境 词法环境有两个部分,环境记录【声明式环境记录,对象式环境记录】和对外部词法环境的引用 词法环境实在代码定义时决定的,和代码在哪里调用没关系。所以js的词法作用域是静态作用域。
3.作用域链 沿着词法环境到找变量的值就是作用域链。
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取决于它定义的位置
let obj = { a: 20, foo: foo } obj.foo() //10
function bar() { foo() } bar.call({a: 20}) //10
7.闭包 闭包就是执行完上下文被弹出执行栈,但是在这种情况下,还保留对词法环境的引用,通过这个引用访问失联的词法环境,这个引用就是闭包。