自己做面试题一定要改写成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)