zoukankan      html  css  js  c++  java
  • 记录一个面试题目

    判断以下代码的执行结果(涉及变量提升,函数声明,原型链,this指向,作用域等知识点)

    掘金 上看到的一个笔试题目,记录并分析总结以下考察点。

      function Foo () {
        getName = function () { alert(1) }
        return this
      }
      Foo.getName = function () { alert(2) }
      
      Foo.prototype.getName = function () { alert(3) }
        
      var getName = function () { alert(4) }
    
      function getName () { alert(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构造函数的getName属性,输出2。

    第二个 调用当前作用域下的getName函数,要注意函数表达式函数声明的不同:

    1. 函数声明会‘被提前’到外部脚本或者外部函数的顶部,所以这种方式声明的函数,可以在它被定义之前的代码中所调用。
    2. 函数表达式,就和声明变量一样了,变量声明会提前到顶部,但是赋值会在执行到原位置的时候才进行。
      4会变量提升,但是并没有赋值,然后5函数提升(在4赋值之前调用下getName(),输出的是5),而代码执行4的位置时,会赋值就覆盖了5。所以第二个会输出4。

    第三个 Foo()执行时,Foo函数体内并没有getName变量,所以就去上一层window下找,重新赋值了window下的getName为输出1(如果没有找到,会在window下创建一个getName),然后返回了this,这里的this指向的是window,再调用window的getName属性,即为重新赋值后的输出1。

    第四个 执行当前作用域下的getName,注意此时getName已经重新赋值,所以输出1

    第五个 这里需要特别注意表达式的执行顺序,详见 MDN

    .无参数列表new执行的优先级高,所以是 new (Foo.getName)() 输出2

    第六个 同样是执行顺序
    ().的执行优先级高,所以是 (new Foo()).getName(),Foo作为构造函数,指定了返回this,而在构造函数中,this指向的是生成的实例,而Foo中没有对实例添加getName属性,所以在调用实例的getName时,会去Foo.prototype中找,所以输出3

    第七个 同样是执行顺序
    new ((new Foo()).getName)() 是以原型链上的getName为构造函数来执行,输出3

  • 相关阅读:
    jsp中添加弹窗口并且实现向后台双向传递数据
    hql中or的用法(代替union)
    hql中in的用法
    spring中的定时任务调度用例
    JS如何将UTC格式时间转本地格式
    HttpSession与Hibernate中Session的区别
    adaptive hash index
    InnoDB Double write
    int(M)与int
    MySQL库目录下db.opt文件的作用
  • 原文地址:https://www.cnblogs.com/shapeY/p/10400763.html
Copyright © 2011-2022 走看看