this的指向
this是 JavaScript 语言的一个关键字。它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。
函数中的this总指向调用它的对象,他的指向一共有以下几种
1. 普通函数中的this
function fun1(el){
console.log(this,el);
}
fun1();
//最普通的函数,实际上在调用时省略了window. 所以这个函数应该是被window调用
普通的函数this谁调用它,this指向谁
2. 对象里面的方法this
var obj = {
name:'gml',
age:'18',
say:function(){
console.log(this);
}
}
say()
如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
var age = 50;
var obj = {
name:'gml',
age:'18',
say:function(){
console.log(`我是${name},今年${age}`)
}
}
obj.say()
这时的age等于50
var age = 50;
grow:function(){
name:'gml',
age:'18',
setInterval(function(){
this.age++;
console.log(this.age)
},3000)
}
}
obj.grow()
这个时候因为有一个全局方法 [setInterval setTimeout等等都是],而全局方法的调用者必定是window,所以这里的age是50开始
var name = "我在window里面";
var obj1 = {
name : "我是obj1里面的",
fn(){
console.log(this);//obj1
var that = this;
console.log(that);
setTimeout(() => { //箭头函数的this指向继承自父级执行上下文中的this 在声明的时候就已经确定了
console.log(this.name); // 我是obj1里面的
console.log(that.name); // 我是obj1里面的
},1000);
}
}
obj1.fn();
箭头函数是对象指向里最特殊的,箭头函数的this指向的是他的上一层作用域的this
3. 构造函数中的this
function fn(name,age){
this.name = name;
this.age = age;
console.log(this);
}
fn(lxy,18)
把构造函数当成普通函数调用 this指向和普通函数一样
function add(a,b){
console.log(this,a,b);
}
// call和apply-bind中使用第一个参数对this进行冒充
sadd.apply({name:'lxy',age:18},[6,7]);
// 把bind的第一个参数作为this,创建一个新的参数
var fn = add.bind({eye:2,leg:2},10,5)
fn(10,5);
//函数简化参数的方式称为函数的柯里化