javascript中的this关键字指向哪里【教程】

发布时间 - 2026-01-31 00:00:00    点击率:
JavaScript中this指向函数调用时的上下文而非定义时;普通调用下非严格模式为全局对象、严格模式为undefined;对象方法赋值或解构后单独调用会丢失this;点号左侧决定this指向;嵌套函数不继承外层this;构造函数中this指向新实例;箭头函数无独立this,由外层作用域决定;call/apply/bind可显式绑定this但对箭头函数无效。

JavaScript 中的 this 不是指向函数定义时的上下文,而是由函数「怎么被调用」决定的——这点最容易误判,也是绝大多数 this 相关 bug 的根源。

普通函数调用时,this 指向全局对象或 undefined

在非严格模式下,直接调用 foo()this 指向 window(浏览器)或 global(Node.js);严格模式下是 undefined

常见错误现象:对象方法赋值给变量后单独调用,this 丢失:

const obj = {
  name: 'Alice',
  say() { console.log(this.name); }
};
const fn = obj.say;
fn(); // undefined(严格模式)或报错(因为 this 没有 name 属性)
  • 这不是“箭头函数没用好”,而是普通函数调用规则本身如此
  • 解决方式不是改用箭头函数(箭头函数不能作为方法被正常调用),而是用 .bind(obj)obj.say.bind(obj),或调用时用 obj.say() 保持上下文
  • ES6 解构时也容易触发此问题:const { say } = obj; say(); 同样丢失 this

对象方法中,this 指向调用该方法的对象

关键看「点号左边是谁」: obj.method()thisobjobj.nested.method()thisobj.nested

但要注意嵌套函数不会继承外层 this

const obj = {
  name: 'Bob',
  run() {
    console.log(this.name); // 'Bob'
    setTimeout(function() {
      console.log(this.name); // undefined —— 这是独立函数调用
    }, 100);
  }
};
  • 回调函数中的 this 和外层无关,除非显式绑定(.bind(this))、用箭头函数(它不绑定 this,而是沿作用域链向上找)、或传入 thisArg(如 setTimeout(() => ..., 100)
  • 类方法中同理:class C { m() { setTimeout(() => this.x) } } 可行,但 setTimeout(function() { this.x }) 不行

构造函数和 class 中,this 指向新创建的实例

new Foo() 调用函数时,this 是新分配的空对象,并最终被返回;class 构造器同理。

  • this 在构造函数里可自由添加属性:this.id = Date.now();
  • 如果忘记写 new,函数会以普通

    方式执行,this 指向全局或 undefined,极易引发意外污染或报错
  • 箭头函数不能用作构造函数,调用会直接抛出 TypeError: xxx is not a constructor

call / apply / bind 显式控制 this 指向

这三个方法允许你强行指定函数运行时的 this 值,优先级高于其他所有绑定规则。

  • fn.call(obj, a, b) 立即执行,thisobj
  • fn.apply(obj, [a, b]) 同上,只是参数传数组
  • fn.bind(obj) 返回一个新函数,后续调用时 this 固定为 obj,即使再用 call 也无法覆盖(bind 之后的 bindcall 无效)
  • 注意:箭头函数无视 call/apply/bind,它的 this 完全由定义时外层作用域决定,不可更改

真正难的不是记住规则,而是识别调用形式——尤其是事件回调、定时器、Promise 回调、解构赋值、高阶函数传参这些场景下,this 很可能已经脱离了直觉。每次不确定时,加一行 console.log(this) 是最稳妥的验证方式。


# javascript  # es6  # java  # js  # node.js  # node  # 浏览器  # app  # 回调函数  # win  # 作用域  # 构造函数  # date  # const  # 继承  # class 


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


相关推荐: 实现点击下箭头变上箭头来回切换的两种方法【推荐】  大型企业网站制作流程,做网站需要注册公司吗?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel如何实现本地化和多语言支持?(i18n教程)  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何在景安服务器上快速搭建个人网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel怎么实现模型属性的自动加密  如何快速配置高效服务器建站软件?  Android自定义listview布局实现上拉加载下拉刷新功能  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  微信小程序制作网站有哪些,微信小程序需要做网站吗?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何快速搭建高效WAP手机网站吸引移动用户?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  javascript如何操作浏览器历史记录_怎样实现无刷新导航  北京专业网站制作设计师招聘,北京白云观官方网站?  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  简单实现Android验证码  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  无锡营销型网站制作公司,无锡网选车牌流程?  如何在万网主机上快速搭建网站?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何用免费手机建站系统零基础打造专业网站?  Android利用动画实现背景逐渐变暗  b2c电商网站制作流程,b2c水平综合的电商平台?  js代码实现下拉菜单【推荐】  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何快速查询网址的建站时间与历史轨迹?  油猴 教程,油猴搜脚本为什么会网页无法显示?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Python文本处理实践_日志清洗解析【指导】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Swift中swift中的switch 语句  怎么用AI帮你为初创公司进行市场定位分析?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布