JavaScript Counter函数中getCount与直接访问count结果差异疑问
核心原因:基础类型赋值是值拷贝,二者指向不同存储单元
你遇到的差异本质是JS的基础类型值传递规则和闭包作用域绑定规则共同作用的结果,具体执行逻辑如下:
- 首先
count是Number类型,属于JS基础类型,所有基础类型的赋值都是值拷贝,不会传递引用 - 调用
Counter()函数时,首先在函数私有作用域内创建了局部变量count,初始赋值为0 inc、dec、getCount三个是闭包函数,它们的作用域链绑定的是Counter函数私有作用域里的count变量,后续这三个函数读写的永远是这个作用域内的count- 构造返回对象时,
count: count的赋值操作是「把当前作用域内count的值(也就是初始的0)复制一份,赋值给返回对象的count属性」,此时返回对象的count属性和函数作用域内的count变量已经是两个完全独立的存储单元,没有任何关联 - 后续调用
counter.inc()修改的是闭包绑定的作用域内的count,不会影响到返回对象上的count属性,因此就出现了二者返回值不一致的情况
验证示例:如果是引用类型赋值,二者就会同步
如果把count改成引用类型,赋值时传递的是内存地址,二者就会同步变化,代码如下:
function Counter() { let count = { value: 0 } function inc() { count.value += 1 } function getCount() { return count.value } return { getCount, inc, count } } const counter = Counter() counter.inc() counter.inc() console.log(counter.getCount()) // 2 console.log(counter.count.value) // 2,此时二者值同步
内容的提问来源于stack exchange,提问作者Limboer
相关产品推荐
相关产品推荐

