this指向一个对象
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的 上下文对象。
- 普通函数是window对象的方法,调用普通函数其实是调用window对象的方法
- 哪个对象调用方法,this便指向哪个对象
this指向总结
-
以函数的形式调用时,this永远都是window
-
以方法的形式调用时,this是调用方法的那个对象
-
以构造函数的形式调用时,this是新创建的那个对象
-
使用call和apply调用时,this是指定的那个对象(详见函数章节)
代码示例
function Person(name, age) {
console.log(this);
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this);
};
}
// 以普通函数调用 相当于Window.Person();
Person(); // Window {parent: Window, opener: null, …}
// 以构造函数调用
var obj1 = new Person('悟空', 18); // Person {} 没有值是因为此时还未添加属性
var obj2 = new Person('八戒', 28); // Person {}
// 以方法调用
obj1.sayName(); // Person {name: "悟空", age: 18, sayName: ƒ}
obj2.sayName(); // Person {name: "八戒", age: 28, sayName: ƒ}
this代替对象
未使用this代替对象
// 创建一个name变量
var name = '全局';
// 创建一个fun()函数
function fun() {
// 相当于 console.log(window.name);
console.log(name);
}
// 创建两个对象
var obj1 = {
name:'悟空',
sayName:fun
};
var obj2 = {
name:'八戒',
sayName:fun
};
// 调用
fun(); // 全局
obj1.sayName(); // 全局
obj2.sayName(); // 全局
// 我们希望调用 obj1.sayName() 可以输出obj1的名字
使用this代替对象
// 创建一个name变量
var name = '全局';
// 创建一个fun()函数
function fun() {
console.log(this.name);
}
// 创建两个对象
var obj1 = {
name:'悟空',
sayName:fun
};
var obj2 = {
name:'八戒',
sayName:fun
};
// 调用
fun(); // 全局
obj1.sayName(); // 悟空
obj2.sayName(); // 八戒