this是一个关键字,在作用域内使用的关键字,它不代表一个准确的内容,它是根据上下文代码使用环境随时变化的。
一,this的指向
全局作用域:
this指向window
局部作用域:
普通函数:this指向window
对象函数:this指向对象(谁调用指向谁)
事件函数:this指向事件源(绑定事件的元素)
定时器:this指向window
构造函数:this指向实例化的对象
箭头函数:this指向继承父级this指向(箭头函数本身没有this)
在严格模式下:this指向undefined
匿名函数:this指向window
静态模式:this指向类
二,改变this的指向
1,call()
语法:
函数.call(this的指向,传递的参数)
var name = 20
function fn(a,b,c,d) {
var name = 10
console.log(a,b,c,d);
console.log(this);
}
var obj = {
name: 30
}
// fn(1)//1 20
fn.call(obj,100,1,2,3)
特点:会立即调用函数
2,apply()
语法:
函数.apply(this的指向,[参数])
var name = 20
function fn(a,b,c,d) {
var name = 10
console.log(a,b,c,d);
console.log(this);
}
var obj = {
name: 30
}
fn.apply(obj,[1,2,3,4])
特点:会立即调用函数,改变函数传参的方式。
3,bind()
语法:
函数.bind(this的指向,参数)
var name = 20
function fn(a,b,c,d) {
var name = 10
console.log(a,b,c,d);
console.log(this);
}
var obj = {
name: 30
}
var a=fn.bind(obj,1,2,3,3)
a()
特点:不会立即调用函数,它会改变不需要立即调用的函数中this指向,会返回一个新的函数,返回的函数中的this指向是被锁定的。