计数器的疑问

FnaticE 2021-03-26 12:37:13
通过构造函数创建了一个 counter 对象:

function Counter() {
let count = 0; //没有this

this.up = function() {
return ++count;
};
this.down = function() {
return --count;
};
}

let counter = new Counter();
counter.up() //1,为什么这里还能得到count的值?


我的理解是,counter对象有up和down两个方法,但是应该没有获得count这个属性,类似这样:

counter={
up(){
return ++count;
},
down(){
return --count;
}
}

怎么还能获取到count的值呢?
...全文
236 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
FnaticE 2021-06-13
  • 打赏
  • 举报
回复

 时隔数月再回过头来看看,对这个问题有了大致的了解。

up和down在“诞生”的时候就记住了当时的词法环境,这个环境可以找到Counter函数作用域内的count变量,即up和down的[[Environment]]的隐藏属性拥有count=0。在实例化后,counter.up()被调用时,up这个方法依然记得count=0这个变量,这就是闭包。

chenrynet 2021-03-29
  • 打赏
  • 举报
回复
引用 2 楼 FnaticE 的回复:
[quote=引用 1 楼 chenrynet 的回复:]let count = 0; 定义了局部变量 还不让人用吗 跟属性有啥关系
这局部变量不应该只作用于函数Counter里吗? 构造函数Counter里的let count = 0没带this,是不是新创建的对象counter就没有count这个属性?那对象方法counter.up()运行的时候怎么会找到函数代码块里的局部变量呢?[/quote] counter函数刚开始定义了局部变量count 函数内部不管是后面定义的方法还是函数都可以拿到这个局部变量 跟属性没任何关系
chenrynet 2021-03-29
  • 打赏
  • 举报
回复
引用 2 楼 FnaticE 的回复:
[quote=引用 1 楼 chenrynet 的回复:]let count = 0; 定义了局部变量 还不让人用吗 跟属性有啥关系
这局部变量不应该只作用于函数Counter里吗? 构造函数Counter里的let count = 0没带this,是不是新创建的对象counter就没有count这个属性?那对象方法counter.up()运行的时候怎么会找到函数代码块里的局部变量呢?[/quote] up down 难道不在counter函数内部吗
酷爱码 2021-03-28
  • 打赏
  • 举报
回复
count加this试试
HAVENT 2021-03-26
  • 打赏
  • 举报
回复
如果自身的作用域中没有该变量,JS 会使用 LSH查询 向父级查询是否存在该变量,如果没有,还会继续向上查询,直到全局作用域为止
FnaticE 2021-03-26
  • 打赏
  • 举报
回复
引用 1 楼 chenrynet 的回复:
let count = 0; 定义了局部变量 还不让人用吗 跟属性有啥关系
这局部变量不应该只作用于函数Counter里吗? 构造函数Counter里的let count = 0没带this,是不是新创建的对象counter就没有count这个属性?那对象方法counter.up()运行的时候怎么会找到函数代码块里的局部变量呢?
chenrynet 2021-03-26
  • 打赏
  • 举报
回复
let count = 0; 定义了局部变量 还不让人用吗 跟属性有啥关系

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧