this
概述:this是一个特殊的对象,他类似于一个指针会指向对应的对象。(在对象的函数内那么对应的this就指向这个对象,在外面的函数内this就指向最顶层的对象window)。this指向当前调用者
对 this 的理解, 三种改变 this 的方式 ?
1.任何情况下直接在script中写入的this都是window。 2.函数中的this 非严格模式:this指向window, 严格模式时:this指向undefined。 3.箭头函数的this this都指向箭头函数外上下文环境的this指向 4.对象中this 对象属性的this 指向对象外上下文环境的this 对象方法(普通函数)中的this,指向当前对象(谁执行该方法,this就指向谁) 5.回调函数的this指向- 1)、 setTimeout,setInterval回调函数不管是否是严格模式都会指向window。
- 2)、通过在函数内执行当前回调函数 非严格模式:this指向window, 严格模式时:this指
- 向undefined。
- 3)递归函数中的this 非严格模式:this指向window, 严格模式时:this指向undefined。
- 4) 使用arguments 0执行函数时 this指向arguments。
- 5)事件中的回调函数,this指向事件侦听的对象(e.currentTarget);
- 如果call,apply,bind传参时,第一个参数传入的不是null或者undefined,传入什么this指向什么
- 如果第一个参数传入的是null或者undefined ,非严格模式下指向window
- 构造函数中的this指向实例当前类所产生的新的实例对象
- 类中实例化方法中this指向谁执行该方法,this指向谁
- 类中静态方法中this执行该类或者该类的构造函数
- 类中实例化箭头方法,this仍然指向当前类实例化的实例对象
- 在原型的方法中,this指向实例化当前构造函数的实例化对象(谁执行该方法,this指向谁);
- 三种改变this指向的方式
- 函数名.call(this,....)this写谁就指谁。
- 函数名.apply(this,[参数1,参数2,...]) this写谁就指谁。
- 函数名. bind (this,1,2,3) this写谁就指谁。
ES5新增改变this指向新增方法
this指向
-
this在函数内的this指向当前函数的调用的者(全局调用的函数this指向window)
-
this在对应的对象内的函数指向当前的对象的
-
this在事件对应的函数内指向当前事件的目标元素
如果需要更改this指向那么我们可以给对应的函数调用对应的方法
相关方法
-
bind (手动调用)
-
apply (自动调用 传递一个数组)(* 如果传递的是数组)
-
call (自动调用 一个个的数据传递)(* 一般常用)
function fn(arg,arg1){ console.log(this); console.log(arg,arg1); } fn() //打印window var obj = {name:'jack'} //调用bind方法来更改this指向 //将对应的函数绑定给obj这个对象 bind不会执行函数 //函数调用的bind方法返回的是一个函数 这个函数不会自动调用 需要你手动调用 var v = fn.bind(obj) //执行函数 v() //bind方法运用 需要手动调用需要()来调用 传参传入到对应的()里面 fn.bind(obj)('你好','世界') //apply 自动调用 第一个参数是绑定的对象 第二个参数是传递的参数(以数组进行传递) fn.apply(obj,['hello','world']) //call 自动调用 第一个参数是绑定的对象 第二个参数是传递的参数 (以一个个的元素进行传递) fn.call(obj,'吃饭了吗','睡觉了吗')
apply方法和call方法的区别
-
apply方法传递的参数以数组形式
-
call方法传递的参数以元素形式
共同点
-
apply方法和call方法都会自动调用对应的函数
更改this指向的三个方法
普通方法
1.call() 方法
var Person = {
name:"lixue",
age:21
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
}
fn("hh",20);
this指向
var Person = {
name:"lixue",
age:21
}
function fn(x,y){
console.log(x+","+y);
console.log(this);
console.log(this.name);
console.log(this.age);
}
fn.call(Person,"hh",20);
现在this就指向person了
2.apply() 方法
apply() 与call()非常相似,不同之处在于提供参数的方式,apply()使用参数数组,而不是参数列表
3.bind()方法
bind()创建的是一个新的函数(称为绑定函数),与被调用函数有相同的函数体,当目标函数被调用时this的值绑定到 bind()的第一个参数上
this指向调用者 在对象里面的函数调用者为对象 在外边的函数调用者为window(global对象 顶层对象)
标签:函数,指向,对象,bind,改变,call,apply From: https://www.cnblogs.com/hofenglang/p/16827362.html