JS作用域链/闭包

笔记参考(或摘录):
深入理解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);

如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。

image.png

闭包理解

闭包指有权访问另一个函数作用域中的变量的函数,即外部可以访问函数内部的局部变量

闭包特点:外层函数内嵌套内层函数,且外层函数返回需要返回内层函数

用途:1)读取函数内部变量(即函数作为返回值); 2)让外层函数的变量保留在内存中(函数可作为参数进行传递)

闭包优点:有利于封装,可以访问局部变量;
闭包缺点:内存占用浪费严重,内存泄露

具体例子:

深入理解javascript原型和闭包(15)——闭包

你可能感兴趣的:(JS作用域链/闭包)