this面试题

210 阅读1分钟

自己做面试题一定要改写成Call的形式

面试题一

var a = {
   name:" 里面的name",
   sayName:function(){
       console.log("this.name = " + this.name);
  }
};

var name = "外面的name";
function sayName(){
    var sss = a.sayName;
    sss(); //this.name = ?
    a.sayName(); //this.name = ?
    (a.sayName)(); //this.name = ?
    (b = a.sayName)();//this.name = ?
}
sayName()

演化(加call)

var a = {
    name:"里面的name",
    sayName:function(){
    console.log("this.name = " + this.name);
  }
};
var name = "外面的name";
function sayName(){
   var sss = a.sayName;
   sss.call(undefined); //this是undefined
   a.sayName.call(a); //this是a,对象后面接一个函数,那么传参第一个就是对象
   (a.sayName).call(a); //this是a,加不加括号没有影响
   b.call(undefined);//this是undefined
}
sayName();

面试题二

var length = 10;
function fn() {
    console.log(this.length);
}
var obj = {
   length: 5,
   method: function(fn) {
     fn();
     arguments[0]();//第一个参数,其实就是fn()
   }
};

obj.method(fn, 1)

演化(加call)

var length = 10;
function fn() {
    console.log(this.length);
}
var obj = {
   length: 5,
   method: function(fn) {
   fn.call(undefined);
   // this是undefined
   arguments[0].call(arguments);
   //arguments.0.call(arguments);
   // this是arguments,也就是[fn,1],数组length是2
}
};

obj.method.call(obj, fn, 1)