一个关于作用域的问题

发布于 2022-09-06 12:18:14 字数 621 浏览 21 评论 0

let foo = () => {
  let a = 111;
  return {
    fn: function() {
      console.log(this);
      a = 222;
    },
    num: function() {
      console.log(this);
      console.log(a);
    }
  };
};
let ins = foo();
ins.fn();
ins.num();  // 222

能否有高手能解答一下,为什么num方法能够访问到fn方法内的变量a?

我自己的思路是,首先执行fn方法,则在fn方法中存在一个值为222的变量a;然后执行num方法,函数体中要输出变量a,首先在num方法当前作用域中寻找,没有找到,然后在上一级作用域foo内找,找到变量a,返回输出111。

可是实践后,返回222,这是什么原因呢?

猜测:按照之前的推理,fn中的变量a覆盖了foo中的变量a,可是找不到理由解释fn中的变量a覆盖foo中的变量a。fn中的变量a不是应该只存在于fn方法中么,为什么可以覆盖?

希望有知道输出222原因的伙伴指点一下,感激不尽!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别把无礼当个性 2022-09-13 12:18:14

问题已解决。
原因:在函数内给标识符赋值时,首先第一步是在作用域链内找到标识符确定标识符是干什么的,若未在作用域链中找到,则隐式的提升为全局变量;若找到定义的标识符,则执行之前的赋值操作,所以问题中的fn变量a的赋值,实际操作的是foo中的变量a并进行了覆盖赋值。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文