为何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能被正确递增,有两种常见方式:
- 直接引用变量,不用
this:
let count = 0; function increaseCounter() { count++; // 直接操作全局作用域的count变量 }; increaseCounter(); console.log(count); // 输出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
相关产品推荐
相关产品推荐

