this的指向
js的this指向一个对象,指定的对象取决于函数执行所绑定的,而不是声明时的环境
- 作为对象的方法调用
- 作为普通函数调用
- 构造器调用
- apply & call调用
作为对象的方法调用
当函数作为对象的方法调用时 this指向该对象
let obj={
name:'hello',
getName:function(){
console.log(this) //obj
}
}
obj.getName()
作为普通函数调用
当函数作为普通函数调用时,this指向全局对象 ,在浏览器中全局对象为window
window.name = 'globalName';
//情况1
let getName=function(){
console.log(this.name) //globalName
}
//情况2
let obj = {
name: "hello",
getName: function () {
console.log(this);
//函数表达式
let test = function () {
console.log(this); //window
};
test();
},
}
obj.getName();
调用 test() 是window对象 不是obj对象
构造器调用
js可以通过构造器创建对象,构造器的外 表跟普通函数一模一样,它们的区别在于被调用的方式。当用 new 运算符调用函数时,该函数总 会返回一个对象,通常情况下,构造器里的 this 就指向返回的这个对象
new 创建对象原理:
let newObj=new F()
1. var obj = {}
2. obj.proto = F.prototype
3. F.apply(obj,argument) //改变了this指向 将this指向新创建的对象
4. return obj
apply & call调用
跟普通的函数调用相比,用 Function.prototype.call 或 Function.prototype.apply 可以动态地 改变传入函数的 this