概念:
this是运行环境下的一个系统变量, 由于this在不同的执行环境下有不同的值, 所以在使用this时,多加注意 (使用this之前,先打印)
1,在全局作用域下,this默认指向window(前端运行环境),{}(后端运行环境).
2,在事件函数中,this指向绑定事件的目标
3,在构造函数中,this指向构造函数将要创建的对象
4,在对象中,this指向对象本身
特殊情况:(1) 有函数嵌套时,内层的函数this不会继承外层函数的this的值,会被还原成window
如果像让内层函数的this和外层函数this统一指向, 内层函数请使用箭头函数(因为箭头函数没有自己的this,会在上下文查找
(2)在ajax回调函数中, this指向window
 
修改this指向
修改this指向:   三种方法    call   apply    bind
 
function add(a, b) {
            console.log(8, this, a + b)
        }
        add(3, 4)
1, 通过call函数修改this指向, 用函数直接调用call(),
第一个参数是this修改后的指向(支持引用类型,如果传入值类型会自动装箱),
后边的参数是函数add的原始参数, 调用call时会直接执行add函数。
  add.call("李四", 5, 6)
 
2,通过apply函数修改this指向, 用函数直接调用apply(),
第一个参数是this修改后的指向(支持引用类型,如果传入值类型会自动装箱),
后边的参数是函数add的原始参数所在的数组,
调用apply时会直接执行add函数
  add.apply(false, [5, 6])
 
3,通过bind函数修改this指向,用函数不会直接调用bind(),
第一个参数是this修改后的指向(支持引用类型,如果传入值类型会自动装箱),
后边的参数是函数add的原始参数, 调用bind时不会直接执行add函数
  var obj = { name: "思聪", age: 10 }
      调用bind后会返回一个新的函数
   var newAdd = add.bind(obj, 5, 6)
      调用新的函数得到修改后的this
   newAdd()
 
3,call和apply和bind的异同点:
            (一), call和apply 修改this指向时会立即调用函数, bind修改指向不会立即调用函数会, 返回一个新函数
            (二), call,bind的第二个参数是函数的原始参数写法, apply的第二个参数必须是数组, 数组中放的是原始参数
 4,使用场景:
        (一), call 适合在调用函数时修改this指向, 直接使用call或apply修改即可
            (二), bind 适合在修改this指向时, 不立即调用函数, 而是时机成熟时在调用的情况,  如: 计时器, ajax请求等异步回调函数的修改

注意:事件函数修改this时,一定要用bind

btn6.onclick = function () {
            console.log(9, this)
        }.bind(document.body)
 
 
 

this的指向问题及改变this指向的更多相关文章

  1. JS中this指向问题和改变this指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  2. Javasript中this指向问题和改变this指向的方法

    在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...

  3. 可以改变this指向的方法

    this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...

  4. call()与apply() 改变this指向

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ...

  5. this指向及改变this指向的方法

    一.函数的调用方式决定了 this 的指向不同,但总的原则,this指的是调用函数的那个对象: 1.普通函数调用,此时 this 指向 全局对象window function fn() { conso ...

  6. 改变this指向的三种方法

    call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...

  7. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  8. $.on()方法和addEventListener改变this指向

    jQuery $.on()方法和addEventListener改变this指向 标签(空格分隔): jQuery JavaScript jQuery $.on() jq的绑定事件使用$([selec ...

  9. (三十七)js改变this指向的方法

    最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1.改变函数内部的this指向的三种方法 ...

随机推荐

  1. 报错————Type interface com.ssm.mapper.NewProductMapper is not known to the MapperRegistry.

    报错: Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface ...

  2. 绕过CDN找到⽬标站点真实IP

    一.判断目标网站是否使用CDN 在渗透测试中,如果连真实 IP 都没有找到的话,相当于连门都没有找到.所以,如何验证目标网站是否使用了 CDN 呢? 1.多地 ping 法(一般情况下使用多地 pin ...

  3. [环境部署] Windows Server 2016 配置指南 之 安装 Redis3.0

    Redis是一个开源的高级key-value(键-值)缓存与存储,以高性能著称.用于做对象缓存,可以获得极佳的性能体验,可是 Redis 的官方开发团队并没有开发针对 Windows 的版本,不过还好 ...

  4. [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)

    [bzoj1791][ioi2008]Island 岛屿(基环树.树的直径) bzoj luogu 题意可能会很绕 一句话:基环树的直径. 求直径: 对于环上每一个点记录其向它的子树最长路径为$dp_ ...

  5. 论文解读(GMI)《Graph Representation Learning via Graphical Mutual Information Maximization》

    Paper Information 论文作者:Zhen Peng.Wenbing Huang.Minnan Luo.Q. Zheng.Yu Rong.Tingyang Xu.Junzhou Huang ...

  6. 数据库中间件ShardingSphere-Proxy(一)

    1.现实中的问题 我们知道数据库的数据,基本80%的业务是查询,20%的业务涵盖了增删改,经过长期的业务变更和积累数据库的数据到达了一定的数量之后,直接影响的是用户与系统的交互,查询时的速度,插入数据 ...

  7. kafka follower如何与leader同步数据?

    Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制.完全同步复制要求All Alive Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率.而异步复制 ...

  8. web.xml---配置文件概要

    web.xml分发器: case1: springMvc的分发器: 作用:将匹配上的请求交由springMvc处理,路径会继续到达springMvc的处理器映射器 <servlet> &l ...

  9. pg数据库排序和limit同时使用遇到的奇怪问题

    这两天由于一位实习生同事回学校答辩,因此我来跟进他之前开发的功能进行测试,测试反馈上来这么一个问题: 也就是说下面这两条sql查询出来的数据前10条的数据不一样. select * from tabl ...

  10. rabbitmq有哪些重要角色和组件?

    rabbitmq有哪些重要角色? 生产者:消息的创建者,负责创建和推送数据到消息服务器 消费者:消息的接收方,用于处理数据和确认消息 代理:就是RabbitMQ本身,用于扮演快递的角色,本身并不生产消 ...