这些阶段是: 创建变量对象(VO) 创建作用域链 为变量赋值 创建阶段:创建变量对象(VO) 变量对象(VO)是一个在执行上下文中创建的类对象容器。它存储了在执行上下文中定义的变量和函数声明。...js console.log(名称);let name = "Victor";将抛出错误: 创建阶段:创建作用域链 在创建了变量对象(VO)之后,就开始创建作用域链,作为执行上下文创建阶段的下一个阶段...当一个函数在另一个函数中定义时,内部函数可以访问外部函数及其父函数中定义的代码。这种行为称为词法作用域。 但是,外部函数不能访问内部函数中的代码。...JavaScript引擎在定义函数的执行上下文中遍历作用域,以解析其中调用的变量和函数,这种做法称为作用域链。 只有当JS引擎无法解析范围链中的变量时,它才会停止执行并抛出错误。...this关键字指的是执行上下文所属的作用域。 一旦创建了作用域链,'this'的值就会由JS引擎初始化。
这些阶段是: 创建变量对象(VO) 创建作用域链 为变量赋值 创建阶段:创建变量对象(VO) 变量对象(VO)是一个在执行上下文中创建的类对象容器。它存储了在执行上下文中定义的变量和函数声明。...js console.log(名称);let name = "Victor";将抛出错误: 创建阶段:创建作用域链 在创建了变量对象(VO)之后,就开始创建作用域链,作为执行上下文创建阶段的下一个阶段...当一个函数在另一个函数中定义时,内部函数可以访问外部函数及其父函数中定义的代码。这种行为称为词法作用域。 但是,外部函数不能访问内部函数中的代码。...JavaScript引擎在定义函数的执行上下文中遍历作用域,以解析其中调用的变量和函数,这种做法称为作用域链。 只有当JS引擎无法解析范围链中的变量时,它才会停止执行并抛出错误。...不创建全局变量对象。相反,它创建一个参数对象,存储传递给函数的所有参数。 创建“this”对象,将全局作用域中的所有变量和函数作为方法和属性存储。
作用域(scope) 是指变量的可访问性,上下文(context)是指 this 在同一作用域内的值。我们也可以使用函数方法来改变上下文,将在稍后讨论。...之后,每个函数调用(启用)将其上下文附加到执行期上下文中。当另一个函数在该函数或其他地方被调用时,会发生同样的事情。 每个函数都会创建自己的执行期上下文。...在创建阶段主要做的三件事情是: 创建变量(激活)对象 创建作用域链 设置上下文(context)的值( `this` ) 变量对象 变量对象,也称为激活对象,包含在执行期上下文中定义的所有变量,函数和其他声明...这是一个在 window 上下文中调用的自动调用的匿名函数,这意味着 this的值为window。暴露一个单一的全局接口来进行交互。...函数自己的参数可以在上下文之后传递。(call或apply用另一个对象来调用一个方法,将一个函数上下文从初始的上下文改变为指定的新对象。简单的说就是改变函数执行的上下文。)
在函数式参数传递的时候被定义的局部变量当然也是可以在激活此函数的时候访问,因为上下文中存储数据的变量对象(环境)在每次进入上下文的时候都会(重新)被创建: function testFn(funArg)...另一个函数对象的问题与在一个动态作用域[4]实现的系统中函数作为参数传递有关。...因此,即使 z 存在(与前面的例子对比,在该实例中,局部变量将从堆栈中移除),仍然存在一个问题:在这么多的 foo 函数的调用中, z 的值是哪个(即 z 来自哪个上下文,哪个作用域)?...引用函数创建算法,我们可以看到ECMAScript中所有的函数都是闭包,因为他们在创建的时候都保存了父级上下文中作用域链。...这里重要的时刻是无论函数是否将在之后被调用,在创建的时候,父级作用域就已经被捕获。
如果使用的是new关键字,则JS会创建一个Object类型的实例,但其行为类似原始值 # 复制值 在通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。...复制后的连个变量实际上指向同一个对象 # 传递参数 ECMAScript 中所有函数的参数都是按值传递的。即函数外的值会被复制到函数内部的参数中,就像一个变量复制到另一个变量一样。...在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返还给之前的执行上下文。 上下文中的代码在执行的时候,会创建变量对象的一个作用域链。该作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。...try/catch语句的catch块(会创建一个新的变量对象,该变量对象会包含要抛出的错误对象的声明) with语句(向作用域链前端添加指定的对象) # 变量声明 使用var的函数作用域声明 变量会被自动添加到最近的上下文...引用计数 对每个值都记录他被引用的次数。声明变量并给它赋一个值时,这个值的引用数为1.如果同一个值又被赋给另一个变量,那么引用数加1.如果保存对该值引用的变量被其他值给覆盖了,那么引用数减1。
,将其对应的函数执行上下文将会从堆栈中弹出,并且控件到达当前堆栈中位于其下方的上下文(如果有下一个函数的话) 执行上下文的生命周期: 创建过程:1.生成变量对象,2.建立作用域链,3.确定this的指向...so,对于功能代码来说,环境记录中包含一个arguments对象,该对象包含传递给该函数的索引和参数与传递给该函数的参数的长度之间的映射。...var id = setTimeout(fn, delay)启动单个计时器,该计时器将在延迟后调用指定的功能,返回一个唯一的id,以后可以使用该id取消计时器。...async异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。...函数可以存储到变量中 函数可以存储为数组的一个元素 函数可以作为对象的成员变量 函数与数字一样可以在使用时直接创建出来 函数可以被传递给另一个函数 函数可以被另一个函数返回 参考文献 How do JavaScript
每当一个新的执行上下文被创建,它会按定义的顺序(将在后文讨论)执行一系列步骤。...执行阶段 执行阶段中,JS 代码开始逐条执行,在这个阶段,JS 引擎开始对定义的变量赋值、开始顺着作用域链访问变量、如果内部有函数调用就创建一个新的执行上下文压入执行栈并把控制权交出…… 销毁阶段 一般来讲当函数执行完成后...,该属性里存放的是一个指向实际内存地址的指针 如果函数名称已经存在了,属性的引用指针将会被覆盖 初始化作用域链 创建 arguments object 检查上下文中的参数,初始化名称和值并创建引用副本...(负责处理 var 定义的变量,初始值为 undefined 造成声明提升) 创建 「外部环境引用」,值为全局对象,或者为父级词法环境(作用域) 创建 「声明式环境记录器」 ,存储变量、函数和参数,它包含了一个传递给函数的...当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。
在Node.js中在全局作用域(scope)中上下文中始终是Global 对象 如果作用域在对象的方法中,则上下文将是该方法所属的对象。...之后,每个函数调用(启用)将其上下文附加到执行期上下文中。当另一个函数在该函数或其他地方被调用时,会发生同样的事情。...在创建阶段主要做的三件事情是: 创建变量(激活)对象 创建作用域链 设置上下文(context)的值( this ) 变量对象 变量对象,也称为激活对象,包含在执行期上下文中定义的所有变量,函数和其他声明...这是一个在 window 上下文中调用的自动调用的匿名函数,这意味着 this的值为window。暴露一个单一的全局接口来进行交互。...this 值)作为第一个参数 hello.apply(context); // 在这里你可以传递上下文(this 值)作为第一个参数 call()或apply()用另一个对象来调用一个方法,将一个函数上下文从初始的上下文改变为指定的新对象
一些名词 JS引擎 — 一个读取代码并运行的引擎,没有单一的“JS引擎”;,每个浏览器都有自己的引擎,如谷歌有V。 作用域 — 可以从中访问变量的“区域”。...闭包 — 当在另一个函数内创建一个函数时,它“记住”它在以后调用时创建的环境。 垃圾收集 — 当内存中的变量被自动删除时,因为它不再使用,引擎要处理掉它。...这些都存在于JS创建的全局上下文中,因为它位于全局空间中。...this 执行 - 它逐行读取代码,给变量赋值,并执行函数a 函数a创建一个新的上下文并被放入堆栈,在上下文中创建变量myOtherVar,然后调用函数b 函数b 也会创建一个新的上下文,同样也被放入堆栈中...5,函数b的上下文中创建了 myVar 变量,并声明函数c 上面提到每个新上下文会创建的外部引用,外部引用取决于函数在代码中声明的位置。
在操作对象时,实际操作的是该对象的引用,所以保存引用值的变量是按引用访问的。 属性的操作 原始值和引用值的定义方式很类似,都是创建一个变量,然后给它赋值。...紧接着,我们创建一个名为tom的空对象 随后,将tom对象当作参数传给setAge方法并调用,声明result1变量来接收其返回值 最后,我们打印tom对象与result1对象的属性,执行结果符合按引用传递参数的规则...执行上下文代码时,当前上下文可以访问到的变量集合就是作用域。 上下文代码在执行的时候,会创建变量对象的一个作用域链,这个作用域链决定了各种上下文的代码在访问变量和函数时的顺序。...接下来,我们画个图来描述下上述例子的作用域链,如下所示: image-20210320181607527 注意⚠️:函数参数被认为是当前上下文中的变量,因此它也跟上下文中的其他变量遵循相同的访问规则。...,JS引擎会把i在循环体的上下文中重新声明并初始化一次 因为let在代码块中都有自己的作用域,所以在for循环中的表达式中使用let它的每一个值都会单独存在一个独立的作用域中不会被覆盖掉。
, 另一个引用变量也看得见 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象 在js调用函数时传递变量参数时, 是值传递还是引用传递?...执行上下文: 动态的, 执行代码时动态创建, 当执行结束消失 联系: 执行上下文环境是在对应的作用域中的 区别1 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。...而不是在函数调用时 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建 函数执行上下文是在调用函数时, 函数体代码执行之前创建 区别2 作用域是静态的, 只要函数定义好了就一直存在,...作用域链 理解 多个上下级关系的作用域形成的链, 它的方向是从下向上的(从内到外) 查找变量时就是沿着作用域链来查找的 查找一个变量的查找规则 在当前作用域下的执行上下文中查找对应的属性, 如果有直接返回...使用: 主线程 // 创建一个Worker对象并向它传递将在新线程中执行的脚本的URL var worker = new Worker('worker.js'); // 绑定用来接收分线程返回的数据的回调
词法变量有一个在编译时静态确定的作用域。词法变量的作用域可以是一个函数或一段代码,该变量在这段代码区域内可见(visibility);在这段区域以外该变量不可见(或无法访问)。...变量对象 VO 是与执行上下文相关的数据作用域。它是一个与上下文相关的特殊对象,其中存储了在上下文中定义的变量和函数声明。...JavaScript 中的作用域链 在 JavaScript 中有两种变量传递的方式 1. 通过调用函数,执行上下文的栈传递变量。...函数每调用一次,就需要给它的参数和变量准备新的存储空间,就会创建一个新的环境将(变量和参数的)标识符合变量做映射。对于递归的情况,执行上下文,即通过环境的引用是在栈中进行管理的。...在函数调用的时候,JavaScript 会为这个函数所在的新作用域创建一个环境,这个环境有一个外层域,它通过 [[ Scope ]] 创建并指向了外部作用域的环境。
那么,执行上下文的周期,分为两个阶段:创建阶段创建词法环境生成变量对象(VO),建立作用域链、作用域链、作用域链(重要的事说三遍)确认this指向,并绑定this执行阶段。...// 见上文创建变量对象的第三步}词法作用域(Lexical scope)这里想说明,我们在函数执行上下文中有变量,在全局执行上下文中有变量。...JavaScript的一个复杂之处在于它如何查找变量,如果在函数执行上下文中找不到变量,它将在调用上下文中寻找它,如果在它的调用上下文中没有找到,就一直往上一级,直到它在全局执行上下文中查找为止。...add 只存在于 createWarp 执行上下文中, 其函数定义存储在名为 add 的自有变量中。第7行,我们返回变量 add 的内容。js引擎查找一个名为 add 的变量并找到它....其实,大家说的都对。不管是函数返回一个函数,还是产生了外部作用域的引用,都是有道理的。所以,什么是闭包?解释一下作用域链是如何产生的。解释一下js执行上下文的创建、执行过程。
(注2:更多内容请查看我的目录。) 1. 简介 JS入门难点系列到此,我们将进行一个阶段性的总结。...执行上下文栈:当JS执行到一个函数的时候,就会创建该函数的“执行上下文(execution context)"。...变量对象:变量对象是与执行上下文相关的数据作用域,存储了在执行上下文中定义的变量和函数声明。全局上下文中的变量对象就是全局对象。...我们来看,只有在执行到一个函数时,才会创建函数执行上下文并压入函数执行上下文栈,不管在当前执行上下文的准备阶段或者是在执行该函数前做了哪些操作,我们只需要关心函数执行那一刻的快照,包括此时该函数的[[scope...然后进入函数执行上下文的代码执行阶段,直到遇见下一个函数执行,周而复始或者执行完毕还没有遇到下一个函数执行,执行完毕的函数上下文就会逐个出栈并销毁,直到程序关闭,全局执行环境销毁。 4.
js引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文。 当调用一个函数时,一个新的执行上下文就会被创建。...而一个执行上下文的生命周期可以分为两个阶段: 创建阶段:在这个阶段,执行上下文会分别创建变量对象,建立作用域链,以及确定this的指向。...变量对象 变量对象的创建过程 建立arguments对象。检查当前上下文中的参数,建立该对象下的属性与属性值。 检查当前上下文的函数声明,也就是使用function关键字声明的函数。...同一个作用域下,对同一个函数的不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值,所以,作用域中变量的值是在执行过程中确定的,而作用域是在函数创建时就确定的。...现在,实现一个函数,接收一个整数并返对该整数进行加1操作且返回: let counter = 1; function increaseCounter(value) { counter =
而 {age: 18, star: 200} 是可变的。 12. 说一说你对JS执行上下文栈和作用域链的理解? 在开始说明JS上下文栈和作用域之前,我们先说明下JS上下文以及作用域的概念。...JS执行上下文 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。...创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。...规则如下: 首次运行JavaScript代码的时候,会创建一个全局执行的上下文并Push到当前的执行栈中,每当发生函数调用,引擎都会为该函数创建一个新的函数执行上下文并Push当前执行栈的栈顶。...《你不知道的JavaScript》 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 创建一个闭包 闭包使得函数可以继续访问定义时的词法作用域。
参数: op:将所有已创建的op(或没有)进行协作的op。 ignore_exists:如果为真,则只在上下文中应用此op的托管,而不是应用堆栈上的所有托管属性。...它们将在未来的版本中被删除。更新说明:始终计算形状;不要使用compute_shapes,因为它没有效果。这是一个用于创建操作的底层接口。...此上下文管理器可用于覆盖将在上下文范围内用于ops的梯度函数。...name参数的解释如下: 字符串(不以'/'结尾)将创建一个新的name作用域,其中name被附加到上下文中创建的所有操作的前缀。...返回值: 传递给create_op()的字符串,该字符串将用于命名正在创建的操作
那么,执行上下文的周期,分为两个阶段:创建阶段创建词法环境生成变量对象(VO),建立作用域链、作用域链、作用域链(重要的事说三遍)确认this指向,并绑定this执行阶段。...// 见上文创建变量对象的第三步}词法作用域(Lexical scope)这里想说明,我们在函数执行上下文中有变量,在全局执行上下文中有变量。...JavaScript的一个复杂之处在于它如何查找变量,如果在函数执行上下文中找不到变量,它将在调用上下文中寻找它,如果在它的调用上下文中没有找到,就一直往上一级,直到它在全局执行上下文中查找为止。...因为这个函数没有参数,直接跳到它的主体部分.3 - 6 行。我们有一个新的函数声明,在createWarp执行上下文中创建一个变量 add。...其实,大家说的都对。不管是函数返回一个函数,还是产生了外部作用域的引用,都是有道理的。所以,什么是闭包?解释一下作用域链是如何产生的。解释一下js执行上下文的创建、执行过程。
上一节我们讨论了执行上下文,那么在上下文中到底有什么内容,为什么它会和作用域链扯上关系,JS 解释器又是怎么找到我们声明的函数和变量,看完这一节,相信大家就不会再迷惑了。...复制代码 全局对象初始化时系统将创建并初始化一系列原始属性,例如:Math、String、Date、parseInt、window等等,之后是我们在全局上下文中自己定义的全局变量。...VO(functionContext) = AO 复制代码 活动对象是在进入函数上下文时刻被创建的,它是通过函数的 arguments 属性进行初始化。arguments 也是一个对象。...另外,properties-indexes 的值和实际传递进来的参数之间是共享的,一个改变,另一个也随之改变。...代码是如何被处理的 在第1节中我们讲过js 代码的编译过程,其中有一步叫作预编译,是说在代码执行前的几微秒会首先对代码进行编译,形成词法作用域,然后执行。
领取专属 10元无门槛券
手把手带您无忧上云