// 1. 普通的函数调用时
function max () {
this.x = 1;
// this 指的是 global 对象,由于 global 对象是作为 window 对象的一部分实现的,因此 this 认为是 window 对象
console.log(this)
}
max();
// 2. 作为对象的方法调用时
var obj = {
fullName: '张康',
sayName: function() {
// this 指的是 obj 对象
console.log(this)
return this.fullName;
}
};
// 函数中的 this 指向的是函数的直接所有者。换句话来说,函数直接属于谁,函数中的 this 就指向谁。
window.obj.sayName();
// 3. 作为构造函数调用时
function Dog(dogName, dogAge) {
// this 指的是新创建的实例,接下来会被自动返回到函数外部
console.log(this)
this.name = dogName;
this.age = dogAge;
}
// 调用构造函数
var dog1 = new Dog('哈士奇', 3);
var dog2 = new Dog('泰迪', 2);
console.log(dog1, dog2)
function sayName(fullName, age) {
console.log(this)
console.log(fullName, age)
}
var obj1 = {
name: '张康'
};
// 使用 call() 方法调用 sayName() 函数,并将 sayName 函数中的 this 的指向改变成了 obj1
sayName.call(obj1, '康博', 20)
function sayName(fullName, age) {
console.log(this)
console.log(fullName, age)
}
var obj1 = {
name: '张康'
};
// 使用 apply() 方法调用 sayName() 函数,并将 sayName 函数中的 this 的指向改变成了 obj1
sayName.apply(obj1, ['康博', 20])
// apply() 与 call() 都是用来改变 this 的指向的,唯一的区别是传参的方式不一样。
function sayName(fullName, age, xiaoming) {
console.log(this)
console.log(fullName, age, xiaoming)
}
var obj1 = {
name: '张康'
};
// bind() 方法并不会帮我调用 sayName() 函数,但是它会返回一个绑定好 this 以及参数的新函数
// 可以用来绑定 this
// 可以用来绑定形参的值
var foo = sayName.bind(obj1, '康博', 20)
foo('赵胤禛');