You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何let声明的count无法通过this递增,var声明却正常?

问题根源:全局作用域下var与let的绑定差异

当你直接调用普通函数increaseCounter()时,函数内部的this指向全局对象(浏览器环境是window,Node.js环境是globalThis)。

  • 用var count = 0声明变量时,count会被自动挂载到全局对象上,成为它的一个属性。所以函数里的this.count++本质是操作全局对象上的count,和你声明的变量是同一个,自然能实现递增。
  • 用let count = 0声明变量时,count属于全局作用域,但不会被挂载到全局对象上。这时候函数里的this.count++相当于给全局对象新增了一个名为count的属性,和你用let声明的那个count完全是两个独立的变量。所以你最后console.log(count)输出的还是最初的0,而全局对象上多了一个值为1的count属性(你可以在浏览器控制台里输入window.count看到它)。
解决方案

如果想让let声明的count能被正确递增,有两种常见方式:

  1. 直接引用变量,不用this:
let count = 0;
function increaseCounter() {
  count++; // 直接操作全局作用域的count变量
};
increaseCounter();
console.log(count); // 输出1
  1. 绑定this到包含count的上下文:
    可以把变量放到一个对象里,通过对象调用函数,此时this会指向该对象:
let count = 0;
const counter = {
  count: count,
  increaseCounter() {
    this.count++;
  }
};
counter.increaseCounter();
console.log(counter.count); // 输出1

或者用call/apply手动指定this的指向:

let count = 0;
function increaseCounter() {
  this.count++;
};
const obj = { count };
increaseCounter.call(obj); // 把this绑定到obj
console.log(obj.count); // 输出1

内容的提问来源于stack exchange,提问作者Dhruv Bhatnagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:15:51