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

this指向及改变this指向的方法原先总结过 this 指向问题 但看了大佬们写的之后 觉得自己遗漏了很多点 所以 结合大佬们的 重写一遍一 函数的调用方式决定了 this 的指向不同 普通函数调用 此时 this 指向 windowfuncti console log this window fn window fn

原先总结过this指向问题,但看了大佬们写的之后,觉得自己遗漏了很多点,所以,结合大佬们的,重写一遍

一、函数的调用方式决定了 this 的指向不同:

1.普通函数调用,此时 this 指向 window

 function fn() { console.log(this); // window } fn(); // window.fn(),此处默认省略window

image.png
2.构造函数调用, 此时 this 指向 实例对象

 function Person(age, name) { 
    this.age = age; this.name = name console.log(this) // 此处 this 分别指向 Person 的实例对象 p1 p2 } var p1 = new Person(18, 'zs') var p2 = new Person(18, 'ww')

image.png

3.对象方法调用, 此时 this 指向 该方法所属的对象

 var obj = { fn: function () { 
    console.log(this); // obj } } obj.fn();

image.png

4.通过事件绑定的方法, 此时 this 指向 绑定事件的对象

<body> <button id="btn">hh 
   button> <script> var oBtn = document.getElementById("btn"); oBtn.onclick = function() { 
     console.log(this); // btn }  
   script>  
   body>

image.png
5.定时器函数, 此时 this 指向 window

 setInterval(function () { 
    console.log(this); // window }, 1000);

image.png

二、更改this指向的三个方法

1.call() 方法
 var Person = { name:"lixue", age:21 } function fn(x,y){ console.log(x+","+y); console.log(this); } fn("hh",20);

image.png

没错,就像上面说的,普通函数的this指向window,现在让我们更改this指向

image.png

 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);

image.png
看,现在this就指向person了

2.apply() 方法

image.png

apply() 与call()非常相似,不同之处在于提供参数的方式,apply()使用参数数组,而不是参数列表

3.bind()方法

image.png
bind()创建的是一个新的函数(称为绑定函数),与被调用函数有相同的函数体,当目标函数被调用时this的值绑定到 bind()的第一个参数上

三、改变this指向的例子

 var oDiv1 = document.getElementById("div1"); oDiv1.onclick = function(){ 
    setTimeout(function(){ 
    console.log(this); },1000) }

image.png
没错,就像上面所说,定时器里的this指向window,那么怎么改成指向div呢

 var oDiv1 = document.getElementById("div1"); oDiv1.onclick = function(){ 
    setTimeout(function(){ 
    console.log(this); }.bind(this),1000) }

image.png
因为在定时器外,在绑定事件中的this肯定指向绑定事件的对象div啊,用call和apply都行

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213092.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:34
下一篇 2026年3月18日 下午6:35


相关推荐

  • Web服务器配置管理

    Web服务器配置管理一文速学 Web 服务器配置管理

    2026年3月19日
    2
  • DateUtil整理

    DateUtil整理背景 DateUtil 整理 便于使用 注 其中大部分功能 jdk 自带或使用第三方工具类即可 推荐使用 hutool 其还有很多方便使用的工具类 dependency groupId cn hutool groupId artifactId hutool all artifactId version 5 3 7 version dependency 特殊

    2026年3月16日
    2
  • kafka集群搭建及简单使用

    kafka集群搭建及简单使用KafkaKafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Li…

    2022年6月10日
    38
  • 完美解决方案_onActivityResult

    完美解决方案_onActivityResult在Service中启动Activity,会报错如下:Intentintent=newIntent(MyService.this,Main2Activity.class);startActivity(intent);…

    2026年4月17日
    3
  • golang 中string和int类型相互转换

    golang 中string和int类型相互转换总结了 golang 中字符串和各种 int 类型之间的相互转换方式 string 转成 int int err strconv Atoi string string 转成 int64 int64 err strconv ParseInt string 10 64 int 转成 string string strconv Itoa int int64 转成 string

    2026年3月26日
    2
  • 【STM32】NVIC中断优先级管理(中断向量表)

    【STM32】NVIC中断优先级管理(中断向量表)STM32F1xx官方资料:《STM32中文参考手册V10》-第9章中断和事件Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F10…

    2022年5月28日
    291

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号