当前位置: 首页 > news >正文

JavaScript中的this到底是什么

目录

目标

概述

隐式绑定

普通函数调用

在严格模式中

在浏览器环境中

在Node.js环境中

对象的方法调用

构造函数调用

setTimeout回调的情况

在箭头函数中

显式绑定

call

apply

bind


目标

        了解this的基本概念,通过案例了解this在不同环境下的指向。


概述

this是什么

        this是当前执行上下文中所指向的对象(实际上就是这个对象的指针或引用),它取决于函数是如何被调用的。也就是说,this是执行上下文的属性。

隐式绑定

        也叫自动绑定。通过对象调用方法时,this指向这个对象。函数直接调用指向全局对象(实际上是全局对象调用了函数)。当然,在严格模式下是undefined。

显式绑定

        调用call,apply或bind明确指定this。显式绑定在回调函数和定时器中经常使用到。它们之间的特点如下:

  • call:立即调用函数并显式指定this,传递给函数的参数格式是:(希望绑定给this的对象,arg1,arg2,……)
  • apply:立即调用函数并显式指定this,传递给函数的参数格式是:(希望绑定给this的对象,[arg1,arg2,……])
  • bind:不立刻调用,而是返回一个新函数,this 被永久绑定。传递给函数的参数格式是:(希望绑定给this的对象,arg1,arg2,……)

隐式绑定

普通函数调用

在严格模式中

function fun(){//设置在严格模式下"use strict";//打印:undefinedconsole.log(this)
}
fun()

在浏览器环境中

在Node.js环境中

function fun(){//打印:global对象console.log(this)
}
//在Node.js环境中调用这个函数,且这个函数没有显式指定 this,那么this默认指向global对象。
fun()


对象的方法调用

const student = {name: "张三",sex: "男",selfIntroduction() {//这里的this就是student对象console.log("姓名:",this.name,";性别:",this.sex)}
}
student.selfIntroduction()
//等价于
console.log("姓名:",student.name,";性别:",student.sex)


构造函数调用

function Student(name,sex){this.name=namethis.sex=sex//打印Student对象的信息console.log(this)
}
new Student("张三","男")


setTimeout回调的情况

const obj = {sayLater: function () {setTimeout(function () {//在Node.js环境下,this绑定成了这个Timeout实例。而非obj对象。//在浏览器中运行则是window对象。console.log(this)}, 1000);}
};
obj.sayLater();


在箭头函数中

注意:普通函数和箭头函数最大的区别就是,普通函数中的this指向调用方,而箭头函数中的this继承外层的上下文。我们刚才演示了this在setTimeout回调的情况,按照刚才的理论,如果使用箭头函数this应该指向sayLater对象。看下面的案例:

const obj = {sayLater: function () {setTimeout( ()=> {console.log(this)}, 1000);}
};
obj.sayLater();


显式绑定

call

function fun(name, sex) {console.log(`name:${name},sex:${sex},age:${this.age}`)
}const student = {name: "张三", sex: "男", age: "18"
}
//打印:name:李四,sex:女,age:18
fun.call(student,"李四","女")

apply

function fun(name, sex) {console.log(`name:${name},sex:${sex},age:${this.age}`)
}const student = {name: "张三", sex: "男", age: "18"
}
//打印:name:李四,sex:女,age:18
fun.apply(student,["李四","女"])

bind

function fun(name, sex) {console.log(`name:${name},sex:${sex},age:${this.age}`)
}const student = {name: "张三", sex: "男", age: "18"
}
const stu=fun.bind(student,"李四","女")
//打印:function
console.log(typeof stu)
//打印:name:李四,sex:女,age:18
stu()
http://www.xdnf.cn/news/124057.html

相关文章:

  • 机器学习--线性回归模型
  • express查看文件上传报文,处理文件上传,以及formidable包的使用
  • NestJS——使用TypeORM操作数据库、增删改查、关联查询、QueryBuilder
  • Cursor中调用本地大语言模型
  • 通过监督微调(SFT)提升AI Agent效果的完整指南
  • 2、DevEco Studio的使用
  • CentOS 7.9升级OpenSSH到9.9p2
  • simulink编程总结
  • import*的展开(开发工具)
  • Linux下载与安装——笔记
  • Java线程池那点事
  • Java Collections工具类指南
  • express-generratior工具用法
  • 2025德国FIBO展会:绝影XENJOY以创新科技引领智能健身新浪潮
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十五页
  • 如何找到win11系统powershell的属性
  • Nature Genetics | 测序技术与深度学习在 circRNA 鉴定中的应用
  • 如何在Android中实现低延迟的多实例RTSP|RTMP播放器
  • 论文阅读笔记——π0.5: a Vision-Language-Action Model with Open-World Generalization
  • Linux命令-strace
  • 第13章 身份验证:使用Identity将用户添加到应用程序中
  • 多线程(线程安全)
  • 处理任务“无需等待”:集成RabbitMQ实现异步通信与系统解耦
  • 十分钟应急响应——自定义工具链整合实战
  • 致远oa部署
  • 炼锌废渣提取钴工艺流程
  • Powershell 命令实操
  • PCB 制造流程分步指南
  • 重磅更新!Nature再推出新子刊!(附Nature全目录下载)
  • 三维重建模块VR,3DCursor,MPR与VR的坐标转换