首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 10 个需要掌握基础的问题

JavaScript 的每个函数都维护对其外部词法环境的引用引用用于配置调用函数时创建的执行上下文。不管何时调用函数,该引用使函数内的代码能够查看在函数外声明的变量。...,函数带有对私有状态的引用,只有它们(以及相同的词法环境声明的任何其他函数)可以访问该私有状态。...请记住,JavaScript的函数可以像变量一样传递,这意味着这些功能和状态的对可以程序传递:类似于c++传递的实例。...所以,如果你想让一个函数总是能够访问私有状态,你可以使用一个闭包,我们经常想把状态和函数联系起来。例如,Java或c++,当你向添加私有实例变量和方法时,这是将状态与功能关联起来。...私有实例变量 在下面的事例,函数 toString 隐藏了 Car 的一些细节。

2.7K20

1w5000字概括ES6全部特性

:只要这些对象在外部消失,它在WeakSet结构引用就会自动消 重点难点 成员都是弱引用,垃圾回收机制不考虑WeakSet结构对此成员的引用 成员不适合引用,它会随时消失,因此ES6规定WeakSet...结构不可遍历 其他对象不再引用成员时,垃圾回收机制会自动回收成员所占用的内存,不考虑成员是否还存在于WeakSet结构 Map Map 定义:类似于对象的数据结构,成员键可以是任何类型的值 声明:...结构不可遍历 其他对象不再引用成员键时,垃圾回收机制会自动回收成员所占用的内存,不考虑成员是否还存在于WeakMap结构 一旦不再需要,成员会自动消失,不用手动删除引用引用的只是键而不是值,值依然是正常引用...指向继承的当前子类(super()调用后才可在构造函数中使用this) 作为对象调用:普通方法中指向父的原型对象,静态方法中指向父 ES5实质:先创造子类实例的this,再将父的属性方法添加到...() { super(); }定义继承父,没有书写则显示定义 子类继承父:子类使用父的属性方法时,必须在构造函数调用super(),否则得不到父的this 实例:相当于实例的原型,所有定义的属性方法都会被实例继承

1.6K20
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript 的 7 种设计模式

由于闭包,即使 IIFE 完成后,返回的对象仍可以访问 IIFE 内部定义的函数和变量。 因此,IIFE 内部定义的变量和函数对外部是看不见的,从而使其成为 myModule 模块的私有成员。...ES6 的模块是以文件形式存储的。每个文件只能有一个模块。默认情况下,模块内的所有内容都是私有的。通过使用 export 关键字来暴露函数、变量。模块内的代码始终严格模式下运行。...3.1 导出模块 有两种方法可以导出函数和变量声明: 函数和变量声明的前面添加 export 关键字。...; } }; 因为 JavaScript 的每个对象都占用一个唯一的内存位置,并且当我们调用该 user 对象时,实际上是返回该对象的引用。...六、装饰器模式 装饰器模式用于扩展对象的功能,而无需修改现有的或构造函数。模式可用于将特征添加到对象,而无需修改底层的代码。

48140

【随手记】数据类型

: 原始数据类型直接存储栈(stack)的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈存储; 引用数据类型存储堆(heap)的对象,占据空间大、大小固定。...如果存储,将会影响程序运行的性能;引用数据类型存储了指针,该指针指向堆该实体的起始地址。当解释器寻找引用值时,会首先检索其的地址,取得地址后从堆获得实体。...闭包有两个常用的用途; 闭包的第一个用途是使我们函数外部能够访问到函数内部的变量。通过使用闭包,可以通过在外部调用闭包函数,从而在外部访问到函数内部的变量,可以使用这种方法来创建私有变量。...闭包的另一个用途是使已经运行结束的函数上下文中的变量对象继续留在内存,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。...2)执行阶段 阶段会完成对变量的分配,最后执行完代码。 简单来说执行上下文就是指: 执行一点JS代码之前,需要先解析代码。

38220

通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能

常常使用模式来避免污染全局命名空间,因为IIFE中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。 问题 3:何时 ES6 中使用箭头函数?...就像展开语法的逆过程一样,它将数据放入并填充到数组而不是展开数组,并且它在函数变量以及数组和对象解构分也经常用到。 ? 问题 6: ES6 和 ES5 函数构造函数有什么区别?...如果咱们创建一个继承Person的Student子类并添加一个studentId字段,以下是两种方式的使用: ? ES5 中使用继承要复杂得多,而且 ES6 版本更容易理解和记住。...问题 13: ES6 的临时死区是什么 主题: JavaScript 难度: ⭐⭐⭐⭐ ES6 ,let 和const 跟 var、class和function一样也会被提升,只是进入作用域和被声明之间有一段时间不能访问它们...对于手动编写的 Map,数组将保留对键对象的引用,以防止被垃圾回收。但在WeakMap,对键对象的引用被“弱”保留,这意味着没有其他对象引用的情况下,它们不会阻止垃圾回收。

1.4K10

前端工程师自检清单73答

引用类型的数据的地址指针是存储于栈的,当我们想要访问引用类型的值的时候,需要先从栈获得对象的地址指针,然后,通过地址指针找到堆的所需要的数据。 3....引用类型: 保存在堆内存的对象,值大小固定,栈内存存放的该对象的访问地址指向堆内存的对象,JavaScript 不允许直接访问堆内存的位置,因此操作对象时,实际操作对象的引用 5....理解值类型和引用类型 JavaScript变量分为基本类型和引用类型: 基本类型: 保存在栈内存的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型: 保存在堆内存的对象...理解 es6 class 构造以及继承的底层实现原理 ES6 的底层还是通过构造函数去创建的。... JavaScript 全局变量的作用域是全局的,代码的任何地方都是有定义的。然而函数的参数和局部变量函数体内有定义。

1.8K21

(转)ES6新特性概览

的支持 ES6添加了对的支持,引入了class关键字(其实classJavaScript中一直是保留字,目的就是考虑到可能在以后的新版本中会用到,现在终于派上用场了)。...下面代码展示了ES6的使用。再次啰嗦一句,你可以将代码贴到traceur自己查看运行结果。...但在ES6,利用解构这一特性,可以直接返回一个数组,然后数组的值会自动被解析到对应接收该值的变量。...而WeakMap,WeakSet则更加安全些,这些作为属性键的对象如果没有别的变量引用它们,则会被回收释放掉,具体还看下面的例子。...ws的这个临时对象没有其他变量引用它,所以ws不会保存它的值,也就是说这次添加其实没有意思 Proxies Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。

92050

【面试】386- JavaScript 面试 20 个核心考点

题目:基本类型和引用类型的区别 基本类型和引用类型存储于内存的位置不同,基本类型直接存储,而引用类型的对象存储,与此同时,存储了指针,而这个指针指向正是堆实体的起始位置。..., JavaScript 运行任何的代码都是执行上下文中运行。...,然后依次按照如下的步骤执行: 如果有形参,先给形参赋值 进行私有作用域中的预解释,函数声明优先级比变量声明高,最后后者会被前者所覆盖,但是可以重新赋值 私有作用域中的代码从上到下执行 函数多了,就有多个函数执行上下文...这种继承方式优点在于构造函数可以传参,不会与父引用属性共享,可以复用父的函数,但是也存在一个缺点就是继承父函数的时候调用了父构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6class 的继承 ES6引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多

44810

JavaScript 面试 20 个核心考点

题目:基本类型和引用类型的区别 基本类型和引用类型存储于内存的位置不同,基本类型直接存储,而引用类型的对象存储,与此同时,存储了指针,而这个指针指向正是堆实体的起始位置。..., JavaScript 运行任何的代码都是执行上下文中运行。...,然后依次按照如下的步骤执行: 如果有形参,先给形参赋值 进行私有作用域中的预解释,函数声明优先级比变量声明高,最后后者会被前者所覆盖,但是可以重新赋值 私有作用域中的代码从上到下执行 函数多了,就有多个函数执行上下文...这种继承方式优点在于构造函数可以传参,不会与父引用属性共享,可以复用父的函数,但是也存在一个缺点就是继承父函数的时候调用了父构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6class 的继承 ES6引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多

37710

横扫 JS 面试核心考点

变量类型 1. JS 的数据类型分类 根据 JavaScript 变量类型传递方式,分为基本数据类型和引用数据类型。...基本类型和引用类型存储于内存的位置不同,基本类型直接存储,而引用类型的对象存储,与此同时,存储了指针,而这个指针指向正是堆实体的起始位置。...this 就是 obj 对象; 构造函数模式(函数体)出现的this.xxx=xxx的this是当前的一个实例; call、apply 和 bind:this 是第一个参数; 箭头函数...这种继承方式优点在于构造函数可以传参,不会与父引用属性共享,可以复用父的函数,但是也存在一个缺点就是继承父函数的时候调用了父构造函数,导致子类的原型上多了不需要的父类属性,存在内存上的浪费。...ES6class的继承 ES6引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多

1.5K03

手把手教会你JavaScript引擎如何执行JavaScript代码

因此 ES6 引入了let和const关键字,从而使 JavaScript 也拥有了块级作用域。 作用域 各类编程语言中,作用域分为静态作用域和动态作用域。...在上面的实例;当b()执行时,foo函数上下文包括作用域都已经被销毁了,但是foo作用域下的a依然可以被访问到;这是因为bar函数引用了foo函数变量对象的值,此时即使创建bar函数的foo函数执行上下文被销毁了...这就是闭包; 闭包使得我们可以从外部读取局部变量,常见的用途包括: 用于从外部读取其他函数内部变量的函数; 可以使用闭包来模拟私有方法; 让这些变量的值始终保持在内存。...),它的this被绑定到正在构造的新对象 的构造函数,this是一个常规对象,中所有非静态的方法都会被添加到this的原型 箭头函数,this指向它被创建时的环境 使用apply、call...、bind等方式调用:根据 API 不同,可切换函数执行的上下文环境,即this绑定的对象 可以看到,this不同的情况下会有不同的指向, ES6 箭头函数还没出现之前,为了能正确获取某个运行环境下

41010

ES6 主要的新特性

的支持 ES6添加了对的支持,引入了class关键字(其实classJavaScript中一直是保留字,目的就是考虑到可能在以后的新版本中会用到,现在终于派上用场了)。...下面代码展示了ES6的使用。再次啰嗦一句,你可以将代码贴到traceur自己查看运行结果。...但在ES6,利用解构这一特性,可以直接返回一个数组,然后数组的值会自动被解析到对应接收该值的变量。...而WeakMap,WeakSet则更加安全些,这些作为属性键的对象如果没有别的变量引用它们,则会被回收释放掉,具体还看下面的例子。...ws的这个临时对象没有其他变量引用它,所以ws不会保存它的值,也就是说这次添加其实没有意思 Proxies Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。

98190

20个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,对键对象的引用被“弱”保留,这意味着没有其他对象引用的情况下,它们不会阻止垃圾回收。

1.2K40

【JavaScript】JavaScript 几个标准阐述

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属性。

20010

通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能

常常使用模式来避免污染全局命名空间,因为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,对键对象的引用被“弱”保留,这意味着没有其他对象引用的情况下,它们不会阻止垃圾回收。

81610

前端面试之JavaScript

,从而形成销毁的上下文。...函数执行函数执行过程,会形成一个全新的私有上下文,可能会被释放,可能不会被释放,不论释放与否,他的作用是: (1)保护:划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,保护自己的私有变量不受外界干扰...(操作自己的私有变量和外界没有关系); (2)保存:如果当前上下文不被释放【只要上下文中的某个东西被外部占用即可】,则存储的这些私有变量也不会被释放,可以供其下级上下文中调取使用,相当于把一些值保存起来了...; 我们把函数执行形成私有上下文,来保护和保存私有变量机制称为闭包。...(作用域链的向上查找,把外围的作用域中的变量值存储在内存而不是函数调用完毕后销毁)设计私有的方法和变量,避免全局变量的污染。

74520

字节跳动最爱考的前端面试题:JavaScript 基础

JavaScript ,我们将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套子作用域中根据标识符名称进行变量变量名或者函数名)查找 什么是作用域链?...闭包产生的本质 当前环境存在指向父级作用域的引用 什么是闭包 闭包是一种特殊的对象,它由两部分组成:执行上下文(代号 A),以及该执行上下文中创建的函数 (代号 B),当 B 执行时,如果访问了 A...变量对象的值,那么闭包就会产生,且 Chrome 中使用这个执行上下文 A 的函数名代指闭包。...,会进行变量提升,但是未被初始化,所以执行上下文执行阶段,执行代码如果还没有执行到变量赋值,就引用变量就会报错,变量未初始化。...创建执行上下文的过程中会做三件事:创建变量对象,创建作用域链,确定 this 指向,其中创建变量对象的过程,首先会为 arguments 创建一个属性,值为 arguments,然后会扫码 function

1.4K20

JavaScript实现私有属性

JavaScript被很多人认为并不是一种面向对象语言,原因有很多种,比如JavaScript没有,不能提供传统的式继承;再比如JavaScript不能实现信息的隐藏,不能实现私有成员。...构造函数内定义局部变量和特权函数,其实例只能通过特权函数访问变量,如下: function Person(name){ var _name = name; this.getName = function...但是这种方式存在一些缺陷: 私有变量和特权函数只能在构造函数创建。通常来讲,构造函数的功能只负责创建新对象,方法应该共享于prototype上。...这种方式目前ES5环境下,基本是最佳方案了。但是仍然有一个致命的缺陷:散列表privateData对每个实例都是强引用,导致实例不能被垃圾回收处理。...造成以上问题的本质是JavaScript的闭包引用,以及只能使用字符串类型最为散列表的key值。针对这两个问题,ES6新增的WeakMap可以良好的解决。 4.

93050

js堆栈内存详解

向后兼容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的值,可以看到,还没调试之前,全局

1.9K40
领券