前端 | 如何绕过面试题中的小坑

赞赏 2017-10-06

常见的面试题分析 , 直接来几道面试题 看看你能否答对




如果你能够都答对可以忽略本文的阅读.免得浪费时间

接下来我要带大家分析下为什么是这样的结果

分析之前你需要明白的是 :创建应用程序的时候,总免不了要声明变量和函数 解析器(interpreter)是如何以及从哪里找到这些数据(变量,函数)的,

当我们引用一个变量时,在解析器内部又发生了什么?

我们知道 变量和执行上下文相关 那么它就应该知道数据储存在哪里以及如何访问这些数据,这种机制被称为变量对象(variable object)

变量对象(简称为 VO)是与某个执行上下文相关的一个特殊对象,并储存了一下数据
1. 变量(var, VariableDeclaration)
2. 函数声明(FunctionDeclaration, 缩写为FD)
3. 函数形参
也就是所有的执行中的变量都会存储在 这个vo

  • 处理上下文代码的几个阶段 本文最核心的部分了 处理执行上下文代码分为两个阶段:
  • 进入执行上下文
  • 当进入执行上下文时(在代码执行前),VO 就会被下列属性填充
  1. 函数的所有形参(如果是在函数执行上下文中)
    每个形参都对应变量对象中的一个属性,该属性由形参名和对应的实参值构成,如果没有传递实参,那么该属性值就为 undefined
  2. 所有函数声明(FunctionDeclaration, FD)
    每个函数声明都对应变量对象中的一个属性,这个属性由一个函数对象的名称和值构成,如果变量对象中存在相同的属性名,则完全替换该属性。
  3. 所有变量声明(var, VariableDeclaration)
    每个变量声明都对应变量对象中的一个属性,该属性的键/值是变量名和 undefined,如果变量名与已经声明的形参或函数相同,则变量声明不会干扰已经存在的这类属性。



  • 执行代码
  • 继续以上一例子,到了执行代码阶段,AO/VO 就会修改为如下形式


  • 如果你看懂了我上面的分析 接下来我带大家分析几个例子

  • 转过头来我来和大家一起分析前面的几道面试题





  • 有一点需要说明的是,我们知道,JS中没有块级作用域,只有函数包含的块才会被当做是作用域。诸如for、if等用花括号包含起来的内容是不算作作用域的。
    也就是说,其中内容隶属于全局作用域,在全局范围内都可以访问到,如下:

总结

你只要明白了 函数执行分2个阶段 (确定上下文 执行代码) 在确定上下文阶段定义vo(ao)对象值时候 的规则
规则如下
argument(函数的形参) > function声明 > var声明 (也就之前提高的变量提升Hoisting)

  • 函数的所有形参(如果是在函数执行上下文中)
    每个形参都对应变量对象中的一个属性,该属性由形参名和对应的实参值构成,如果没有传递实参,那么该属性值就为 undefined
  • 所有函数声明(FunctionDeclaration, FD)
    每个函数声明都对应变量对象中的一个属性,这个属性由一个函数对象的名称和值构成,如果变量对象中存在相同的属性名,则完全替换该属性。
  • 所有变量声明(var, VariableDeclaration)
    每个变量声明都对应变量对象中的一个属性,该属性的键/值是变量名和 undefined,如果变量名与已经声明的形参或函数相同,则变量声明不会干扰已经存在的这类属性。
登陆后阅读全文
阅读 2817 赞赏 0 有用 5 没用 0 收藏 0 分享

   



0 条留言

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

@摩拜小程序为什么关锁后,还是那个开锁界面?

看片要当心了!色站不只掏空你,还可能掏空你的电脑 | 网页中可能包含JS挖矿机脚本!!!

Chrome 调试工具的一些高阶功能

前端 | 如何绕过面试题中的小坑

说说Javascript的闭包(Closure)是怎么回事?

ajax返回的http status是200 没有进success方法 却进入了error方法?

为umeditor增加引用功能

JS将RGB,RGBA颜色值转换成16进制的形式

umeditor 报错:Discontiguous selection is not supported

怎么禁用onbeforeunload()方法

手机扫一扫
分享文章