笔记参考(或摘录):
深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
深入理解javascript原型和闭包(14)——从【自由变量】到【作用域链】
深入理解javascript原型和闭包(15)——闭包
JavaScript深入之作用域链
作用域链理解
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
作用域链只能往外找(往父级)
//例1
let a = 10;
function foo(y) {
// console.log(x); //Uncaught ReferenceError: x is not defined
console.log(a); //10
(function fn() {
let x = 10;
console.log(y); //20
})();
}
foo(20);
如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。

闭包理解
闭包指有权访问另一个函数作用域中的变量的函数,即外部可以访问函数内部的局部变量
闭包特点:外层函数内嵌套内层函数,且外层函数返回需要返回内层函数
用途:1)读取函数内部变量(即函数作为返回值); 2)让外层函数的变量保留在内存中(函数可作为参数进行传递)
闭包优点:有利于封装,可以访问局部变量;
闭包缺点:内存占用浪费严重,内存泄露
具体例子:
网友评论