堆栈内存的一道面试题

114 阅读2分钟

function Foo () { getName = function() { console.log(1) } return this }

Foo.getName = function () { console.log(2) } Foo.prototype.getName = function () { console.log(3) } var getName = function () { console.log(4) } function getName () { console.log(5) }

Foo.getName() //2

getName() // 4

Foo().getName() // 1 getName() // 1

new Foo.getName() // 2 new Foo().getName() // 3 new new Foo().getName() //3

/** *

  • 先变量提升 Foo -> AAAFFF000 AAAFFF000 这里包括 ‘代码字符串’ getName -> func ->2 prototype BBBFFF000
  • BBBFFF000 包括 constructor -> Foo 还有getName: func -> 3
  • getName => func -> 5
  • 然后代码执行
  • getName 后被var 那个东西执行了 就是 getName = func ->4 (!!!!这里我不明白)
  • Foo.getName() 执行 取的是 AAAFFF000里的 func 是2
  • getName() 执行 目前全局的是4
  • Foo().getName() 这个执行 首先Foo执行 当个普通函数执行 我们创建一个 执行上下文 getName 这个 不是私有变量 ,找上级作用域 ,所以全局的作用域被修改了,改为 func-> 1 (!!!!这里我不明白) 然后return 了 this 普通函数this就是window (但是 obj 里边 this 是 obj 具体看this指向知识) 所以 Foo()之后返回 window 然后 windoww.getName() 就是 1
  • 然后 全局的getName() 执行还是1
  • 然后 new 这里还可以考 new 实现和 区别 (!!!!)
  • 然后 new Foo.getName() 这个考虑 运算优先级 可以看下边网站 在这里 new 无参数是 18 foo.getName()是 19 所以先执行这个 之前分析Foo.getName() 执行 取的是 AAAFFF000里的 func 是2 所以 这个现在是 new func-> 2 (!!!!new也会执行 )所以这里是2
  • 然后 new Foo().getName() 这个考虑 运算优先级 可以看下边网站 在这里 new 无有参数 是 19 foo.getName()是 19 所以从左到右执行 所以先创建 Foo的实例 然后 调用实例的方法 就是 原型方法 原型 上方法是 func -> 3 所以这个结果是3
  • 最后一个 new new Foo().getName() 这个同理new 无参数 是18 new 有参数19 函数执行 19 所以 先是 new Foo().getName() 这个是 func -> 3 所以在 new func->3 结果还是 3 */

// js运算的优先级的一个网站 // developer.mozilla.org/en-US/docs/…