美文网首页
从[[scope]]说闭包

从[[scope]]说闭包

作者: 静_summer | 来源:发表于2019-08-28 16:23 被阅读0次

闭包

词法作用域是在定义时确定的: [[scope]]
上下文是函数执行时的变量环境: vo + [[scope]]
所以闭包执行的时候是通过[[scope]]来访问作用域链上的变量。

函数的从声明到执行的过程:

  • 创建(引擎准备并填充三个变量)
    + vo:函数参数,内部变量, 函数内部声明
    + scope chain: 作用域链
    + 确定this的值并填充
  • 执行
  • 词法作用域
    代码创建时定义的静态作用域
  • 上下文
    代码运行时,this的指向

作用域链(函数定义的时候确定):

每个函数在定义的时候都有一个[[scopes]]属性,指向的是它的作用域链。直到函数销毁。其中closure是闭包,script指向自身变量,global指向全局变量

[[Scopes]]: Scopes[3]
         0: Closure (foo) {y: 20}
         1: Script {bar: ƒ}
         2: Global {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, 
     function foo() {
         alert(x);
     }
     
     (function () {
         var x = 20;
         foo(); // 10, but not 20
     })();
     var x = 10;
     // 通过Function构造的函数,不能访问闭包变量,只能访问全局变量,[[scope]]作用域链没有closure
     function foo() {
     
     var y = 20;
     
     function barFD() { // 函数声明
         alert(x);
         alert(y);
     }
     
     var barFE = function () { // 函数表达式
         alert(x);
         alert(y);
     };
     
     var barFn = Function('alert(x); alert(y);');
     
     barFD(); // 10, 20
     barFE(); // 10, 20
     barFn(); // 10, "y" is not defined
     
     }
     
     foo();
     // 变量查找= 作用域链查找(直到global没有找到) + 原型链查找
     function foo() {
     // var x = 20;
     
     function bar() {
         alert(x);
     }
     
     bar();
     }
     
     Object.prototype.x = 10;
     
     foo(); // 20

 ```
* 在代码执行阶段有两个声明能够修改作用域链:
     * with
     * catch
 ``` javascript
 // 普通的闭包的作用域链在定义的时候确定,不能修改参数的调用值
     var x = 10;
     function foo() {
         alert(x);
     }
     (function () {
         var x = 20;
         foo(); // 10, but not 20
     })();
 // 使用with之后,with绑定的对象推到作用域链的最前端,同时再进行变量赋值,能够改变参数的调用值
     var x = 10, y = 10;

     with ({x: 20}) {
     
     var x = 30, y = 30;
     
         alert(x); // 30
         alert(y); // 30
     }
     
     alert(x); // 10
     alert(y); // 30
 ```

相关文章

  • 从[[scope]]说闭包

    闭包 词法作用域是在定义时确定的: [[scope]]上下文是函数执行时的变量环境: vo + [[scope]]...

  • 你不可不知道的 JavaScript 作用域和闭包

    原文出处:JavaScript Scope and Closures 作用域和闭包是 JavaScript 中重要...

  • Python中的闭包是什么?

    目录 作用域(scope) 闭包的定义 闭包的作用 总结 2018.4.15更新了对于函数作用域的理解内容 1.作...

  • 2018-05-09作用域

    1.函数的属性 [[scope]] 2.闭包的作用闭包能够使用公有变量 可以做缓存 实现私有变量 实现模块化开发,...

  • js背诵计划

    谈谈你对闭包的理解,以及在项目中的应用! 回答技巧 1.阐述闭包是什么?(引申:堆栈、EC、AO、VO、SCOPE...

  • ES5之闭包

    1、什么是闭包? 概念闭包记住了声明scope下的变量,在别的时间空间下,调用函数时 ,依然可以读取到这些变量。原...

  • 内存泄漏

    闭包 在闭包中,内部函数引用外部函数变量,实际上是应用了外部函数的作用域(scope)对象 如果作用域对象所在函数...

  • 目录

    前言 规范 "Up & Going" 第一部分:作用域与闭包("Scope & Closures") 1.1 作用...

  • 闭包引起的循环引用问题

    闭包的内存管理 为什么苹果要区分逃逸闭包和非逃逸闭包类,当然是从性能优化上考虑的。上篇文章我们说非逃逸闭包的作用域...

  • 什么是闭包

    从入行就有人跟我说闭包,到现在闭包也是前端躲不开的概念,每次面试的时候我也会问一下闭包相关的问题,今天针对闭包写一...

网友评论

      本文标题:从[[scope]]说闭包

      本文链接:https://www.haomeiwen.com/subject/nerjectx.html