js前端面试题一句话说完经典问题

做用域

做用域是变量和函数生效的区域。分为全局变量和局部变量。函数外面不能访问函数里面的,函数里面的能够访问函数外面的。彼此独立的区间不能互相访问。 每一个js的函数都是一个对象,对象有些属性咱们能够访问,有些只能供js引擎存取,咱们访问不了。[[scope]]就是其中之一。scope就是咱们所说的做用域,其中存储了执行期上下文的集合。这个集合成链式结构,咱们把这个连式结构称做做用域链。 当函数执行的前一刻,会建立一个称为执行期上下文的内部对象。一个执行期上下文定义一个函数执行环境,函数每次执行对应的执行上下文都是独一无二的。因此屡次调用一个函数会致使建立多个执行期上下文,当函数执行完毕时候,执行期上下文就会被销毁。数组

js运行三部曲

  • 语法解析
  • 预编译
  • 解析执行

预编译

预编译分为函数预编译和全局预编译 预编译总共有四个步骤,第一个先建立一个AO对象(activation object),也叫做执行期上下文。第二个找到形参和变量声明,将变量和形参名做为AO的属性,值为undefined。第三部是实参和形参相统一,把实参值传到形参中。第四部将函数声明提高,值赋给函数体。 全局预编译是首先建立一个GO对象(blobal object),window就是GO。AO上面没有就看GO.缓存

闭包

当内部函数被保存到外部时,将生成闭包,闭包会致使做用域链不释放,形成内存泄漏。闭包

  • 实现公有变量(累加器)
  • 作缓存 (存储结构)
  • 实现封装,属性私有化
  • 模块开发防止污染全局变量

构造函数

构造函数必须用new 这个操做符,构造函数内部原理是使用new以后,里面会有三步隐式转换。app

  • 在函数体最前面隐式的加上 var this = {} 空对象
  • 执行 this.xxx = xxx
  • 隐式的返回 return this

原型

原型是function对象的的一个属性,他定义了构造函数制造出来的对象的公有祖先。经过该构造函数产生的对象,能够继承原型的属性和方法。原型也是对象。 使用原型能够提取出来公有属性。对象属性的增删和原型上属性的增删改查。对象经过__proto__ 查看原型。对象可经过constructor查看构造函数。函数

原型链

函数的原型是另外一个构造函数,另外一个构造函数有原型,就造成原型链。原型链上的增删改查和原型基本一致,只有本人有的权限,资损失没有的。 谁调用的方法内部this就指向谁。绝大多数的对象最终都会继承自Object.prototype 除了 Object.create(null?原型)this

继承

  • 原型链继承
  • 借用构造函数继承 call applay
  • 共享原型
  • 圣杯模式 另外加一个中间构造函数存储原型

this

  • 预编译 this 指向 window
  • 全局做用域 this 指向 window
  • call/applay 可改变函数运行时候this的指向
  • obj.func() func() 里的 this 指向obj 谁调用指向谁

深度克隆的步骤

  • 一、先把全部的值都遍历一遍(看是引用值和原始值) 用 for ( var prop in obj ),对象和数组均可以使用
  • 二、判断是原始值,仍是引用值?用 typeof 判断是否是 object 1)若是是原始值就直接拷贝 2)若是是引用值,判断是数组仍是对象
  • 三、判断是数组仍是对象?(方法 instanceof【看 a 的原型链上有没有 b 的原型】、 toString、constructor,建议用 toString,另外两个有个小 bug——跨父子域不行) 1)若是是数组,就新建一个空数组; 2)若是是对象,就新建一个空对象。
  • 四、创建了数组之后,若是是挨个看原始对象里面是什么,都是原始值就能够直接考 过来了;或者,创建了对象之后,挨个判断对象里面的每个值,看是原始值仍是 引用值
  • 五、递归
相关文章
相关标签/搜索