JAVAscript中的this指向和this指向的修改
this 关键字
- 一般在函数中使用,表示哪个对象执行了当前函数。
- 每一个函数内部都有一个关键字是
this
。 - 函数内部的 this 只和函数的调用方式有关系,和函数的定义方式没有关系
- 函数内部的 this 指向谁,取决于函数的调用方式。
window
- JS中的顶层对象,所有的全局都属于
window
。
对象(Object)
- 数据类型,描述了事物,可以有属性,可以有函数;如有函数,在执行了这个函数后,this才是当前对象。
函数
- 是载体,或作用域,其中的this表示当前函数在执行是的所属对象。
this指向
- 默认情况下,this是当前所在函数的执行对象。
- 没有明确隶属对象的函数,被直接执行,一般都是
window
。 - 有所属兑现的函数,被执行,一般都是当前函数的所属对象(
隐式绑定this
)。 - 不管这个函数是谁的,有没有所属对象,只要作为参数传递,通过参数执行这个函数,一般情况下都是
window
:(隐式丢失
)。 new
绑定:函数被执行后,函数内部的this
会指向new
出来的实例。- 箭头函数、定时器、延时器内部没有
this
,箭头函数的this
是上下文的 this
。 注意:不是所有回调函数中的this都指向window---某些特殊情况下被系统修改。
修改this的指向
修改this指向的规则
this的内容必须是对象,如果不是强行转成对象,但依然符合之前数据类型的使用规则
。
为什么修改this指向
- 修正。
- 继承:利用this的指向,借用别的对象的方法。
方法
call方法
- 参数:一个或多个
①:一个参数:第一个参数是修改后this的指向。
②:多个参数:其他所有参数表示向函数中正常传参。 - 功能:修改原函数的this指向,
切记:仅仅是在当前qpply执行的时候修改了
。 - 返回值:是原函数的返回值,没有修改原函数。
- 会立即执行函数。
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, 1, 2)//此时this指向obj
apply方法
- 参数:
①一个参数:第一个参数是修改之后this的指向。
②二个参数:第二个参数是一个数组,这个数组中所有的数据,被自动展开之后,传入原函数,可以省略。 - 功能:修改原函数的this指向
切记:仅仅是在当前qpply执行的时候修改了
。 - 返回值:原函数的返回值,没有修改原函数。
- 会立即执行函数。
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.apply(obj, [1, 2])//此时this指向obj
bind方法
- 参数:
①第一个参数:修改之后的this指向。
②多个参数:后面所有的参数都是向函数中正常传递的实参,可以省略,也可以传多个。 - 功能:修改this的指向,
切记:仅仅是在当前qpply执行的时候修改了
。 - 返回值:修改了this之后的新函数,没有修改原函数。
var obj = { name: 'Jack' }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
var newFn = fn.bind(obj)//此时this的指向已经修改
// fn.bind(obj,1,2)()|| fn.bind(obj)(1,2)||newFn(1, 2)这三种方式都能执行bing方法修改this指向后的函数
方法的区别
- call和apply的区别是第一个参数以后的参数。
- call与apply和bind的区别:
①call和apply会自动执行,执行之后的返回值时原函数的返回值。
②bind执行之后,会得到一个新函数,如果需要,新函数需要手动执行。