JavaScript 中的每个函数都维护对其外部词法环境的引用。此引用用于配置调用函数时创建的执行上下文。不管何时调用函数,该引用使函数内的代码能够查看在函数外声明的变量。...中,函数带有对私有状态的引用,只有它们(以及在相同的词法环境中声明的任何其他函数)可以访问该私有状态。...请记住,JavaScript中的函数可以像变量一样传递,这意味着这些功能和状态的对可以在程序中传递:类似于在c++中传递类的实例。...所以,如果你想让一个函数总是能够访问私有状态,你可以使用一个闭包,我们经常想把状态和函数联系起来。例如,在Java或c++中,当你向类添加私有实例变量和方法时,这是将状态与功能关联起来。...私有实例变量 在下面的事例中,函数 toString 隐藏了 Car 类的一些细节。
:只要这些对象在外部消失,它在WeakSet结构中的引用就会自动消 重点难点 成员都是弱引用,垃圾回收机制不考虑WeakSet结构对此成员的引用 成员不适合引用,它会随时消失,因此ES6规定WeakSet...结构不可遍历 其他对象不再引用成员时,垃圾回收机制会自动回收此成员所占用的内存,不考虑此成员是否还存在于WeakSet结构中 Map Map 定义:类似于对象的数据结构,成员键可以是任何类型的值 声明:...结构不可遍历 其他对象不再引用成员键时,垃圾回收机制会自动回收此成员所占用的内存,不考虑此成员是否还存在于WeakMap结构中 一旦不再需要,成员会自动消失,不用手动删除引用 弱引用的只是键而不是值,值依然是正常引用...指向继承的当前子类(super()调用后才可在构造函数中使用this) 作为对象调用:在普通方法中指向父类的原型对象,在静态方法中指向父类 ES5实质:先创造子类实例的this,再将父类的属性方法添加到...() { super(); }定义继承父类,没有书写则显示定义 子类继承父类:子类使用父类的属性方法时,必须在构造函数中调用super(),否则得不到父类的this 实例:类相当于实例的原型,所有在类中定义的属性方法都会被实例继承
由于闭包,即使在 IIFE 完成后,返回的对象仍可以访问 IIFE 内部定义的函数和变量。 因此,IIFE 内部定义的变量和函数对外部是看不见的,从而使其成为 myModule 模块的私有成员。...ES6 的模块是以文件形式存储的。每个文件只能有一个模块。默认情况下,模块内的所有内容都是私有的。通过使用 export 关键字来暴露函数、变量和类。模块内的代码始终在严格模式下运行。...3.1 导出模块 有两种方法可以导出函数和变量声明: 在函数和变量声明的前面添加 export 关键字。...; } }; 因为 JavaScript 中的每个对象都占用一个唯一的内存位置,并且当我们调用该 user 对象时,实际上是在返回该对象的引用。...六、装饰器模式 装饰器模式用于扩展对象的功能,而无需修改现有的类或构造函数。此模式可用于将特征添加到对象中,而无需修改底层的代码。
: 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储; 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。...如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。...闭包有两个常用的用途; 闭包的第一个用途是使我们在函数外部能够访问到函数内部的变量。通过使用闭包,可以通过在外部调用闭包函数,从而在外部访问到函数内部的变量,可以使用这种方法来创建私有变量。...闭包的另一个用途是使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。...2)执行阶段 此阶段会完成对变量的分配,最后执行完代码。 简单来说执行上下文就是指: 在执行一点JS代码之前,需要先解析代码。
常常使用此模式来避免污染全局命名空间,因为在IIFE中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。 问题 3:何时在 ES6 中使用箭头函数?...就像展开语法的逆过程一样,它将数据放入并填充到数组中而不是展开数组,并且它在函数变量以及数组和对象解构分中也经常用到。 ? 问题 6: ES6 类和 ES5 函数构造函数有什么区别?...如果咱们创建一个继承Person类的Student子类并添加一个studentId字段,以下是两种方式的使用: ? 在 ES5 中使用继承要复杂得多,而且 ES6 版本更容易理解和记住。...问题 13: ES6 中的临时死区是什么 主题: JavaScript 难度: ⭐⭐⭐⭐ 在 ES6 中,let 和const 跟 var、class和function一样也会被提升,只是在进入作用域和被声明之间有一段时间不能访问它们...对于手动编写的 Map,数组将保留对键对象的引用,以防止被垃圾回收。但在WeakMap中,对键对象的引用被“弱”保留,这意味着在没有其他对象引用的情况下,它们不会阻止垃圾回收。
引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。 3....引用类型: 保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript 不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用 5....理解值类型和引用类型 JavaScript中的变量分为基本类型和引用类型: 基本类型: 保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型: 保存在堆内存中的对象...理解 es6 class 构造以及继承的底层实现原理 ES6 类的底层还是通过构造函数去创建的。...在 JavaScript 中全局变量的作用域是全局的,在代码的任何地方都是有定义的。然而函数的参数和局部变量只在函数体内有定义。
子类构建时不能向父类传参 //在构造函数中,一般很少有数组形式的引用属性,大部分情况都是:基本属性 + 方法。...function Parent() { this.name = "父亲"; // 实例基本属性 (该属性,强调私有,不共享) this.arr = [1, 2]; // 引用类型 } Parent.prototype.say...子类实例不共享父类构造函数的引用属性。...{ this.name = name; // 实例基本属性 (该属性,强调私有,不共享) this.arr = [1]; // (引用类型) this.say = function...如果函数是在某个 上下文对象 下被调用 this 绑定的是那个上下文对象,例 : var obj = { foo : foo }; obj.foo(); foo 中的 this 就是 obj .
类的支持 ES6中添加了对类的支持,引入了class关键字(其实class在JavaScript中一直是保留字,目的就是考虑到可能在以后的新版本中会用到,现在终于派上用场了)。...下面代码展示了类在ES6中的使用。再次啰嗦一句,你可以将代码贴到traceur自己查看运行结果。...但在ES6中,利用解构这一特性,可以直接返回一个数组,然后数组中的值会自动被解析到对应接收该值的变量中。...而WeakMap,WeakSet则更加安全些,这些作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉,具体还看下面的例子。...ws的这个临时对象没有其他变量引用它,所以ws不会保存它的值,也就是说这次添加其实没有意思 Proxies Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。
题目:基本类型和引用类型的区别 基本类型和引用类型存储于内存的位置不同,基本类型直接存储在栈中,而引用类型的对象存储在堆中,与此同时,在栈中存储了指针,而这个指针指向正是堆中实体的起始位置。..., JavaScript 中运行任何的代码都是在执行上下文中运行。...,然后依次按照如下的步骤执行: 如果有形参,先给形参赋值 进行私有作用域中的预解释,函数声明优先级比变量声明高,最后后者会被前者所覆盖,但是可以重新赋值 私有作用域中的代码从上到下执行 函数多了,就有多个函数执行上下文...这种继承方式优点在于构造函数可以传参,不会与父类引用属性共享,可以复用父类的函数,但是也存在一个缺点就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6中class 的继承 ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多
变量类型 1. JS 的数据类型分类 根据 JavaScript 中的变量类型传递方式,分为基本数据类型和引用数据类型。...基本类型和引用类型存储于内存的位置不同,基本类型直接存储在栈中,而引用类型的对象存储在堆中,与此同时,在栈中存储了指针,而这个指针指向正是堆中实体的起始位置。...this 就是 obj 对象; 在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例; call、apply 和 bind:this 是第一个参数; 箭头函数...这种继承方式优点在于构造函数可以传参,不会与父类引用属性共享,可以复用父类的函数,但是也存在一个缺点就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6中class的继承 ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多
因此 ES6 中引入了let和const关键字,从而使 JavaScript 也拥有了块级作用域。 作用域 在各类编程语言中,作用域分为静态作用域和动态作用域。...在上面的实例中;当b()执行时,foo函数上下文包括作用域都已经被销毁了,但是foo作用域下的a依然可以被访问到;这是因为bar函数引用了foo函数变量对象中的值,此时即使创建bar函数的foo函数执行上下文被销毁了...这就是闭包; 闭包使得我们可以从外部读取局部变量,常见的用途包括: 用于从外部读取其他函数内部变量的函数; 可以使用闭包来模拟私有方法; 让这些变量的值始终保持在内存中。...),它的this被绑定到正在构造的新对象 在类的构造函数中,this是一个常规对象,类中所有非静态的方法都会被添加到this的原型中 在箭头函数中,this指向它被创建时的环境 使用apply、call...、bind等方式调用:根据 API 不同,可切换函数执行的上下文环境,即this绑定的对象 可以看到,this在不同的情况下会有不同的指向,在 ES6 箭头函数还没出现之前,为了能正确获取某个运行环境下
常常使用此模式来避免污染全局命名空间,因为在IIFE中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。 问题 3:何时在 ES6 中使用箭头函数?...如果咱们创建一个继承Person类的Student子类并添加一个studentId字段,以下是两种方式的使用: // ES5 Function Constructorfunction Student(name...问题 13: ES6 中的临时死区是什么 主题: JavaScript难度: ⭐⭐⭐⭐ 在 ES6 中,let 和const 跟 var、class和function一样也会被提升,只是在进入作用域和被声明之间有一段时间不能访问它们...构造函数和原型是实现类和实例的合理方法之一。它们与模型并不完全对应,因此通常需要选择一个特定的scheme或辅助方法来实现原型中的类。 问题 18: ES6 Map 和 WeakMap 有什么区别?...对于手动编写的 Map,数组将保留对键对象的引用,以防止被垃圾回收。但在WeakMap中,对键对象的引用被“弱”保留,这意味着在没有其他对象引用的情况下,它们不会阻止垃圾回收。
在IE8更低的版本的浏览器中不能直接使用JSON解析方法。 不过,可以在浏览器中添加es5-shim.js来增加浏览器对ES5功能的支持。...console.log(window.a || global.a) ; undefined let、const在全局作用域下声明的变量不会作为属性添加到全局作用域对象里面 console.log...; ● let、const在全局作用域下声明的变量不会作为属性添加到全局作用域对象里面,与var不同; ● let、const的执行速度比var快65%左右; 使用场景: ● 模块内不变的引用和常量...实际项目中,用ES6转译工具将ES6代码转为ES5,格式可能会丢失。因为在ES5中没有字符串模板格式。 箭头函数 这个短函数的声明更加方面。...类 有了类,就有extends,对于开发者来说,使用class很大的好处是实现一个类的代码模块只能在一个地方定义。而以前是在代码中的任意位置去扩展基类的prototype属性。
常常使用此模式来避免污染全局命名空间,因为在IIFE中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。 问题 3:何时在 ES6 中使用箭头函数?...如果咱们创建一个继承Person类的Student子类并添加一个studentId字段,以下是两种方式的使用: // ES5 Function Constructor function Student(...问题 13: ES6 中的临时死区是什么 主题: JavaScript 难度: ⭐⭐⭐⭐ 在 ES6 中,let 和const 跟 var、class和function一样也会被提升,只是在进入作用域和被声明之间有一段时间不能访问它们...构造函数和原型是实现类和实例的合理方法之一。它们与模型并不完全对应,因此通常需要选择一个特定的scheme或辅助方法来实现原型中的类。 问题 18: ES6 Map 和 WeakMap 有什么区别?...对于手动编写的 Map,数组将保留对键对象的引用,以防止被垃圾回收。但在WeakMap中,对键对象的引用被“弱”保留,这意味着在没有其他对象引用的情况下,它们不会阻止垃圾回收。
,从而形成不销毁的上下文。...函数执行函数执行过程中,会形成一个全新的私有上下文,可能会被释放,可能不会被释放,不论释放与否,他的作用是: (1)保护:划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,保护自己的私有变量不受外界干扰...(操作自己的私有变量和外界没有关系); (2)保存:如果当前上下文不被释放【只要上下文中的某个东西被外部占用即可】,则存储的这些私有变量也不会被释放,可以供其下级上下文中调取使用,相当于把一些值保存起来了...; 我们把函数执行形成私有上下文,来保护和保存私有变量机制称为闭包。...(作用域链的向上查找,把外围的作用域中的变量值存储在内存中而不是在函数调用完毕后销毁)设计私有的方法和变量,避免全局变量的污染。
在 JavaScript 中,我们将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套子作用域中根据标识符名称进行变量(变量名或者函数名)查找 什么是作用域链?...闭包产生的本质 当前环境中存在指向父级作用域的引用 什么是闭包 闭包是一种特殊的对象,它由两部分组成:执行上下文(代号 A),以及在该执行上下文中创建的函数 (代号 B),当 B 执行时,如果访问了 A...中变量对象的值,那么闭包就会产生,且在 Chrome 中使用这个执行上下文 A 的函数名代指闭包。...,会进行变量提升,但是未被初始化,所以在执行上下文执行阶段,执行代码如果还没有执行到变量赋值,就引用此变量就会报错,此变量未初始化。...在创建执行上下文的过程中会做三件事:创建变量对象,创建作用域链,确定 this 指向,其中创建变量对象的过程中,首先会为 arguments 创建一个属性,值为 arguments,然后会扫码 function
JavaScript被很多人认为并不是一种面向对象语言,原因有很多种,比如JavaScript没有类,不能提供传统的类式继承;再比如JavaScript不能实现信息的隐藏,不能实现私有成员。...构造函数内定义局部变量和特权函数,其实例只能通过特权函数访问此变量,如下: function Person(name){ var _name = name; this.getName = function...但是这种方式存在一些缺陷: 私有变量和特权函数只能在构造函数中创建。通常来讲,构造函数的功能只负责创建新对象,方法应该共享于prototype上。...这种方式在目前ES5环境下,基本是最佳方案了。但是仍然有一个致命的缺陷:散列表privateData对每个实例都是强引用,导致实例不能被垃圾回收处理。...造成以上问题的本质是JavaScript的闭包引用,以及只能使用字符串类型最为散列表的key值。针对这两个问题,ES6新增的WeakMap可以良好的解决。 4.
向后兼容ES6的执行过程: 因为变量提升,所以var a,function a都在全局执行上下文EC(G)中的全局变量环境VO(G)中创建一个全局变量a 代码执行a = 0,全局变量环境VO(G)中a...,并在全局变量中创建一个func,指向这个堆内存 执行func(5),执行一个函数,会为其创建一个私有的执行上下文EC(func),在其中会创建一个私有变量环境AO(func) 在EC(func)初始其作用域链...EC(FUNC),作用域链是它自身上下文EC(BLOCK)和上级执行上下文EC(FUNC),在块级中,`var x = 3它声明了x,所以x是块级作用域中的私有变量,当执行x = 3时,将块级中的x =...[自身执行上下文EC(FUNC2),作用域EC(FUNC)],没有形参和变量声明,所以没有自身私有变量;执行里面函数体x = 2,在EC(FUNC2)中找不到x,所以去它作用域上级找EC(FUNC),EC...,因为window全局变量太多,不好找到全局VO(G)的x,所以我在Watch中添加了window.x变量,方便我们观察VO(G)中(也就是浏览器的Global)x的值,可以看到,还没调试之前,全局中的
领取专属 10元无门槛券
手把手带您无忧上云