为了账号安全,请及时绑定邮箱和手机立即绑定

一个关于作用域的问题

一个关于作用域的问题

aluckdog 2019-03-01 18:12:49
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原因的伙伴指点一下,感激不尽!
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-12
  • 1 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信