javascript 中 this 的值取决于函数调用的方式,而非定义位置,这被称为“运行时绑定”。 这常常让开发者困惑。

举例说明:
const user = { name: "john", greet() { const sayhi = () => { console.log(`hi, ${this.name}!`); }; setTimeout(sayhi, 1000); },};user.greet(); // 1秒后输出: "hi, john!"
箭头函数 sayhi 从其周围作用域继承 this。如果使用普通函数,this 将指向全局对象(或在严格模式下为 undefined),导致 this.name 未定义。
箭头函数的特殊之处在于它们没有自己的 this 绑定。它们继承父级作用域的 this。
立即学习“Java免费学习笔记(深入)”;
const obj = { value: 42, getvalue: () => { console.log(this.value); },};obj.getvalue(); // undefined
即使 getvalue 是 obj 的方法,箭头函数也不会从对象继承 this,而是从其定义位置(可能是全局或模块作用域)继承。
慧中标AI标书
慧中标AI标书是一款AI智能辅助写标书工具。
120 查看详情
ECMAScript 规范中关于 this 绑定的规则:
构造函数函数 (使用 new 调用): this 指向新创建的对象。方法: this 指向拥有该方法的对象。箭头函数: this 继承自封闭作用域。普通函数调用: this 指向全局对象,或在严格模式下为 undefined。
理解这些规则有助于预测不同情况下 this 的值。
实际应用示例:
class EventEmitter { constructor() { this.events = {}; this.emit = (event, ...args) => { // 使用箭头函数保持 this const handlers = this.events[event] || []; handlers.forEach((handler) => handler.apply(this, args)); }; } on(event, handler) { this.events[event] = this.events[event] || []; this.events[event].push(handler); }}const emitter = new EventEmitter();emitter.on("test", function() { console.log(this === emitter); // true});emitter.emit("test");
此例中,emit 使用箭头函数确保 this 始终指向 EventEmitter 实例,而事件处理函数则通过 apply 方法绑定 this。 这并非魔法,而是 JavaScript 函数参数传递的特殊机制。
以上就是wtf是&#this&#在JavaScript中的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/370688.html
微信扫一扫
支付宝扫一扫