解析器在调用函数时,每次都会向函数内部传递一个隐含的参数,这个参数就是this,根据调用形式的不同,this的指向也是不同的:
1.以函数的形式调用,this永远都是window;
例如:
function fun(){
console.log(this)
}
fun();
//以上打印结果为widow
2.以方法的形式调用,this就是调用方的那个对象。
例如:
function fun(){
console.log("holl");
}
fun();
var a=new Object()
a.name="tom";
a.sayName=fun;
a.sayName();
//console.log( a.sayName==fun) //打印结果为ture,
//console.log( a.sayName()==fun()) //打印结果为ture,
//表明他们是一样的,但是,this却指向不同
// a.sayName();打印出的是holl,对象创建方式也可用 var a = {}形式创建
同时,1也可以这样写,即fun()是window的对象:
function fun(){
console.log(this)
}
window.fun();
而this指向的其实也是一个对象,这个对象我们称为函数执行的上下文对象,所以1,2其实都是以方法形式调用,所以整合起来一句话:
以方法的形式调用,this就是调用方法的那个对象
实际应用:
希望调用 obj1.sayName();的时候 打印tom;obj2.sayName();的时候 打印hrry
var name="全局";
function fun(){
console.log(name);
}
fun();
var obj={
name:"tom",
sayName:fun
};
var obj2={
name:"hrry",
sayName:fun
};
obj.sayName();
// 执行以上,控制台打印结果为全局,目标未能实现,利用this改造代码
var name="全局";
function fun(){
console.log(this.name); // 打印结果为“全局”
}
fun();
var obj1={
name:"tom",
sayName:fun
};
var obj2={
name:"hrry",
sayName:fun
};
obj1.sayName();// 打印结果为tom
obj2.sayName();// 打印结果为hrry
网友评论