ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

闭包

2021-11-29 12:35:15  阅读:139  来源: 互联网

标签:闭包 上下文 函数 对象 eval 执行 变量


论闭包前先了解以下执行上下文

执行上下文

什么是执行上下文:执行上下文是评估和执行JavaScript代码的环境的抽象概念,每当JavaScript代码运行时,它都是在执行上下文中运行的。

执行上下文的类型

全局执行上下文

这是基础的或者默认的执行上下文,任何不再函数内部的代码都在全局执行上下文中。在浏览器中,全局执行上下文会创建一个全局的window对象,并让this指向window对象,一个程序只能有一个全局执行上下文。

函数执行上下文

每当一个函数被调用时,都会为该函数创建一个新的执行上下文,每个函数都有它的执行上下文件了。多个函数对应多个函数执行上下文,所以函数执行上下文可以有任意多个,这是函数执行上下文与全局执行上下文的区别之一。

Eval函数执行上下文

eval() 函数用于将传入的字符串当做 JavaScript 代码进行执行。如果传入的参数不是字符串,那么eval()将传入值原封不动得返回。

console.log(eval('2 + 2'));
// expected output: 4

eval(new String("2 + 2")); 
// 返回了包含"2 + 2"的字符串对象


console.log(eval('2 + 2') === eval('4'));
// expected output: true

 

执行在eval函数内部的代码会拥有属于它自己的执行上下文。

执行上下文的生命周期

一个执行上下文的生命周期分为创建和执行阶段

创建阶段

创建阶段发生的三件事是:

1.创建变量对象

创建变量对象主要包括三个步骤:

1.检查当前上下文中的参数。该过程生成Arguments对象。并建立以形参变量名为属性名,形参变量值为属性值的属性。

2.检索当前上下文中的函数声明。该过程建立以函数名为属性名,函数所在的内存地址引用为属性值的属性。

3.检索当前上下文中的变量声明。该过程建立变量名为属性名,undefine为属性值的属性。

2.建立作用域链

作用域链是由当前上下文和上层上下文的一系列变量对象所组成的层级链。在执行上下文执行阶段。当需要查找某个变量或者函数时,会在当前执行上下文中的变量对象中查找,如果没有找到则会沿着上层上下文的变量对象层层往上查找,直到查找到全局上下文中的变量对象。

3.确定this指向

当函数被调时,会创建该函数的执行上下文,同时确定this的指向,所以说this是在函数被调用时确定的。

关于this指向。

执行阶段

执行阶段的工作只要是为变量赋值以及执行其他代码,在执行阶段,变量对象会转换为活动对象,原先声明的变量会被赋值。

 

标签:闭包,上下文,函数,对象,eval,执行,变量
来源: https://www.cnblogs.com/GiornoGiovanna/p/15618825.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有