开发者社区> 问答> 正文

this 面试题

this指向了谁? 看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window 2如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象 3 如果一个函数在调用的时候通过构造函数模式调用,则它内部的this指向了生成的实例 4 如果这个函数是通过方法借用模式调用,则这个函数内部的this就是我们手动指定this。

展开
收起
kun坤 2019-11-28 14:02:46 358 0
1 条回答
写回答
取消 提交回答
  • //第1题
    function Fn() {
      console.log(this);
    }
    Fn(); //window 普通函数调用模式
    new Fn(); //{}  构造函数调用模式
    Fn.apply(Fn); // Fn的函数体   方法借用模式
    
    //第2题
    var o = {
      f: function() {
        console.log(this);
      },
      2: function() {
        console.log(this);
        console.log(this.__proto__ === o[2].prototype);
      }
    };
    o.f(); //o   对象调用模式
    o[2](); //o  对象调用模式
    new o[2](); //存疑,存在着优先级的问题 {}  通过构造函数模式进行调用
    o.f.call([1, 2]); //[1,2]   call方法进行方法借用。
    o[2].call([1, 2, 3, 4]); // [1,2,3,4]  call方法进行方法借用
    
    //第3题
    var name = "out";
    var obj = {
      name: "in",
      prop: {
        name: "inside",
        getName: function() {
          return this.name;
        }
      }
    };
    
    console.log(obj.prop.getName()); //对象调用模式来进行调用  obj.prop.name  'inside'
    var test = obj.prop.getName; // 把test这个变量指向了obj.prop.getName所在的内存地址。
    console.log(test()); //普通函数模式来进行调用  window 'out'
    console.log(obj.prop.getName.apply(window)); //方法借用模式  'out'
    console.log(obj.prop.getName.apply(this)); //方法借用模式  'out'
    console.log(this === window); //true
    
    //第4题
    var length = 10;
    function fn() {
      console.log(this.length);
    }
    var obj = {
      length: 5,
      method: function(f) {
        console.log(this);
        f(); // f在调用的时候是什么调用模式?普通函数调用模式  window.length  10
        arguments[0](); // 通过什么模式来进行调用的。执行之前有[]和.就是对象调用模式。
        //arguments是一个类数组,也就是一个对象,就是通过arguments来进行调用的
        //arguments.length实参的数量。实参长度是1
        //通过arguments对象进行调用,因此函数内部的this是  arguments
        // 如果一个函数在调用的时候它前面有call和apply那么就肯定是方法借用模式调用
        arguments[0].call(this);
        // 调用method方法是通过obj.method 因此在这里的this就是 obj
        //通过call方法把fn内的this指向了obj
        // 输出obj.length  5
      }
    };
    obj.method(fn);
    
    //第5题
    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
    // new Foo()创建了一个构造函数,然后这个函数再去访问getName这个函数,
    //对它进行调用
    /*console.log(new Foo().getName)*/
    /*var o = new new Foo().getName(); //
        console.log(o.__proto__===Foo.prototype.getName.prototype)*/
    //用new Foo创建出来了一个实例,然后这个实例去访问 (new Foo().getName)
    
    /*console.log(new new Foo().getName())
    
        console.log(new Foo().getName())*/
    
    /*function Foo() {
            getName = function () {
                console.log(1);
            };
            return this;
        }
        var getName;
        Foo.getName = function () {
            console.log(2);
        };
        Foo.prototype.getName = function () {
            console.log(3);
        };
        getName = function () {
            console.log(4);
        };
        //请写出以下输出结果:
        Foo.getName();// 2
        getName();//4
    /!*    Foo().getName();//!*!/
        window.getName()//1
        getName();//1
      /!*  var o = new Foo.getName();//2
        console.log(o);// {}
        console.log(o.__proto__===Foo.getName.prototype)//true*!/
        new Foo.getName();// 2
        new Foo().getName();//
        new new Foo().getName();*/
    
    //第6题
    var obj = {
      fn: function() {
        console.log(this);
      }
    };
    obj.fn(); //obj
    var f = obj.fn;
    f(); //window
    console.log(f === obj.fn); // true
    
    // f和obj.fn是同一个函数,但是他们在调用的时候使用的函数调用模式不同,因此,它们内部的this指向也就不同。
    
    // #7题
    var arr = [
      function() {
        console.log(this);
      }
    ];
    arr[0](); //数组本身
    //数组也是一个复杂数据类型,也是一个对象,那用数组去调用函数,使用的模式就是对象方法调用模式。
    function f() {
      console.log(this);
    }
    function fn() {
      console.log(arguments); // 类数组,也是就一个对象    [0:function f(){}]
      console.log(this); // window
      arguments[0]();
      console.log(arguments[0]); //内部的this就是arguments
      // 通过arguments对f这个方法进行调用,使用的是对象方法调用模式。
    }
    fn(f);
    
    // #8题
    function SuperClass() {
      this.name = "women";
      this.bra = ["a", "b"];
    }
    
    SuperClass.prototype.sayWhat = function() {
      console.log("hello");
    };
    
    function SubClass() {
      this.subname = "you sister";
      SuperClass.call(this);
    }
    
    var sub = new SubClass();
    console.log(sub.sayWhat());
    
    
    2019-11-28 14:02:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
面试常考算法 立即下载
程序员面试宝典 立即下载
低代码开发师(初级)实战教程 立即下载