javascript函数this指向问题

class Lock {
	#flag = false;
	#delayTime = 0;
	#callback = null;
	constructor(callback, delayTime = 0) {
		if (typeof callback !== "function") {
			throw new Error("callback must be a function");
		}
		if (typeof delayTime !== "number") {
			throw new Error("delayTime must be a number");
		}
		this.#flag = false;
		this.#callback = callback;
		this.#delayTime = delayTime;
	}
	lock() {
		this.#flag = true;
	}
	unlock() {
		setTimeout(() => {
			this.#flag = false;
		}, this.#delayTime);
	}
	async run() {
		if (this.#flag) return;
		this.lock();
		let result = await this.#callback();
		this.unlock();
		return result;
	}
}
/**
 * 执行回调函数
 * @param callback
 */
function RunFunc(callback) {
	callback();
}

let lock = new Lock(function () {
	console.log(111);
}, 50);

lock.run();

当调用lock.run时,此时lock内部的this指向就是该函数本身Lock,正常输出111
在这里插入图片描述

执行下面的函数

RunFunc(lock.run);

RunFuncthis指向window,所以传过来的lock.runthis也被改变为this,此时RuncFunc内调用lock.run时会报错TypeError: Cannot read properties of undefined (reading '#flag')

在这里插入图片描述

在这里插入图片描述

解决方法

使用下面的方式传递即可解决


RunFunc(() => {
	lock.run();
});
RunFunc(function () {
	lock.run();
});

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值