javascript this是什么_它的指向如何确定

发布时间 - 2026-01-10 00:00:00    点击率:
this指向取决于调用方式而非定义位置;call/apply/bind可显式绑定且优先级最高;普通调用时非严格模式指向全局,严格模式为undefined;箭头函数无this,继承词法作用域this。

JavaScript 中 this 指向谁,取决于函数怎么被调用

不是看函数在哪定义,也不是看它写在哪个对象里,而是看执行时的「调用方式」。同一个函数,不同调用方式下 this 可能完全不同。

callapplybind 会显式绑定 this

这三个方法直接指定函数运行时的 this 值,优先级高于其他规则(除了箭头函数)。

  • func.call(obj, arg1, arg2):立即执行,this 指向 obj
  • func.apply(obj, [arg1, arg2]):立即执行,参数以数组传入
  • const bound = func.bind(obj):返回新函数,this 永远绑定为 obj
  • 多次 bind 无效,只有第一次生效
function logThis() {
  console.log(this);
}
const obj = { name: 'test' };
logThis.call(obj); // { name: 'test' }
logThis.bind({ x: 1 }).call({ y: 2 }); // 仍然是 { x: 1 },第二次 call 不覆盖 bind 的 this

普通函数调用(非严格模式 vs 严格模式)

这是最容易出错的场景——没任何修饰地直接写 fn()

  • 非严格模式下:this 指向 window(浏览器)或 global(Node.js)
  • 严格模式下:thisundefined
  • ES6 模块默认启用严格模式,所以模块内直接调用函数时 this 很可能是 undefined
"use strict";
function foo() {
  console.log(this); // undefined
}
foo();

箭头函数没有自己的 this

它不遵循上述任何规则,而是沿用定义时所在词法作用域的 this 值,且无法被 call/apply/bind 修改。

  • 常用于事件回调、定时器中避免 this 丢失
  • 不能用作构造函数(没有 prototype,调用 new 会报错)
  • 在对象方法中写箭头函数,this 不指向该对象,而是外层作用域
const obj = {
  name: 'Alice',
  regular() {
    return this.name; // 'Alice'
  },
  arrow: () => {
    return this.name; // undefined(全局中 this 没有 name)
  }
};
真正麻烦的是嵌套函数 + 异步 + 类方法混合的场景,比如 setTimeout 里调用对象方法,或 React 类组件中事件处理函数忘记绑定 this。这时候别硬记规则,直接用 console.log(this) 看一眼最实在。


# react  # javascript  # es6  # java  # js  # node.js  # node  # 浏览器  # app  # win  # 作用域 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS中将个别页面强制横屏其他页面竖屏  如何用景安虚拟主机手机版绑定域名建站?  C语言设计一个闪闪的圣诞树  如何有效防御Web建站篡改攻击?  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  北京企业网站设计制作公司,北京铁路集团官方网站?  Android仿QQ列表左滑删除操作  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel怎么实现验证码(Captcha)功能  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Android Socket接口实现即时通讯实例代码  Python图片处理进阶教程_Pillow滤镜与图像增强  javascript基于原型链的继承及call和apply函数用法分析  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  如何在服务器上配置二级域名建站?  BootStrap整体框架之基础布局组件  如何基于云服务器快速搭建个人网站?  如何撰写建站申请书?关键要点有哪些?  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  js实现获取鼠标当前的位置  详解vue.js组件化开发实践  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  晋江文学城电脑版官网 晋江文学城网页版直接进入  图册素材网站设计制作软件,图册的导出方式有几种?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何使用withoutEvents方法临时禁用模型事件  如何在局域网内绑定自建网站域名?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  原生JS实现图片轮播切换效果  网站优化排名时,需要考虑哪些问题呢?  网站制作报价单模板图片,小松挖机官方网站报价?  详解jQuery停止动画——stop()方法的使用  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧