飞道的博客

JAVAscript中的this指向和this指向的修改

283人阅读  评论(0)

JAVAscript中的this指向和this指向的修改

this 关键字

  1. 一般在函数中使用,表示哪个对象执行了当前函数。
  2. 每一个函数内部都有一个关键字是 this
  3. 函数内部的 this 只和函数的调用方式有关系,和函数的定义方式没有关系
  4. 函数内部的 this 指向谁,取决于函数的调用方式。

window

  1. JS中的顶层对象,所有的全局都属于window

对象(Object)

  1. 数据类型,描述了事物,可以有属性,可以有函数;如有函数,在执行了这个函数后,this才是当前对象。

函数

  1. 是载体,或作用域,其中的this表示当前函数在执行是的所属对象。

this指向

  1. 默认情况下,this是当前所在函数的执行对象。
  2. 没有明确隶属对象的函数,被直接执行,一般都是window
  3. 有所属兑现的函数,被执行,一般都是当前函数的所属对象(隐式绑定this)。
  4. 不管这个函数是谁的,有没有所属对象,只要作为参数传递,通过参数执行这个函数,一般情况下都是window:(隐式丢失)。
  5. new绑定:函数被执行后,函数内部的this会指向new出来的实例。
  6. 箭头函数、定时器、延时器内部没有 this,箭头函数的 this上下文的 this
  7. 注意:不是所有回调函数中的this都指向window---某些特殊情况下被系统修改。

修改this的指向

修改this指向的规则

this的内容必须是对象,如果不是强行转成对象,但依然符合之前数据类型的使用规则

为什么修改this指向

  1. 修正。
  2. 继承:利用this的指向,借用别的对象的方法。

方法

call方法

  1. 参数:一个或多个
    ①:一个参数:第一个参数是修改后this的指向。
    ②:多个参数:其他所有参数表示向函数中正常传参。
  2. 功能:修改原函数的this指向,切记:仅仅是在当前qpply执行的时候修改了
  3. 返回值:是原函数的返回值,没有修改原函数。
  4. 会立即执行函数。
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方法

  1. 参数:
    ①一个参数:第一个参数是修改之后this的指向。
    ②二个参数:第二个参数是一个数组,这个数组中所有的数据,被自动展开之后,传入原函数,可以省略。
  2. 功能:修改原函数的this指向切记:仅仅是在当前qpply执行的时候修改了
  3. 返回值:原函数的返回值,没有修改原函数。
  4. 会立即执行函数。
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方法

  1. 参数:
    ①第一个参数:修改之后的this指向。
    ②多个参数:后面所有的参数都是向函数中正常传递的实参,可以省略,也可以传多个。
  2. 功能:修改this的指向,切记:仅仅是在当前qpply执行的时候修改了
  3. 返回值:修改了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指向后的函数

方法的区别

  1. call和apply的区别是第一个参数以后的参数。
  2. call与apply和bind的区别:
    ①call和apply会自动执行,执行之后的返回值时原函数的返回值。
    ②bind执行之后,会得到一个新函数,如果需要,新函数需要手动执行。

转载:https://blog.csdn.net/qq_46370188/article/details/115528681
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场