先看一段简单代码
var cat={
name:"cat",
language:"miao",
shout:function(){
console.log(this.language);
}
}
var language="hello word"
cat.shout()//1方法调用
function shout(){
console.log(this.language);
}
shout()//2函数式调用
cat.shout.apply(cat) //3apply调用
cat.shout.apply(window) //4apply调用
window.shout.apply(window)//5
window.shout.apply(cat)//6
从结果上看1,3,6输出是一样的,2,4,5是一样的
从调用角度理解,其实方法调用和函数式调用都是apply调用的语法糖,转化后就能很好的理解对应的this是什么
new 构造函数调用有点不同 ,它本质也是一种函数调用语法糖。
var Cat=function(name){
this.name='name
}
var c1=new Cat("miao");
console.log(c1)
//等价于
function fNew(){
var fun=Array.prototype.shift.call(arguments)
var c={}
c.__proto__=fun.prototype
fun.apply(c,arguments)
return c;
}
var c2=fNew(Cat,"miao")
console.log(c2)
可以看到c1和c2结果是一直的,其实也是调用了apply方法改变了this指向













网友评论