鍍金池/ 問答/Java  HTML/ 一個關(guān)于作用域的問題

一個關(guān)于作用域的問題

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方法內(nèi)的變量a?

我自己的思路是,首先執(zhí)行fn方法,則在fn方法中存在一個值為222的變量a;然后執(zhí)行num方法,函數(shù)體中要輸出變量a,首先在num方法當(dāng)前作用域中尋找,沒有找到,然后在上一級作用域foo內(nèi)找,找到變量a,返回輸出111。

可是實(shí)踐后,返回222,這是什么原因呢?

猜測:按照之前的推理,fn中的變量a覆蓋了foo中的變量a,可是找不到理由解釋fn中的變量a覆蓋foo中的變量a。fn中的變量a不是應(yīng)該只存在于fn方法中么,為什么可以覆蓋?

希望有知道輸出222原因的伙伴指點(diǎn)一下,感激不盡!

回答
編輯回答
笨笨噠

問題已解決。
原因:在函數(shù)內(nèi)給標(biāo)識符賦值時,首先第一步是在作用域鏈內(nèi)找到標(biāo)識符確定標(biāo)識符是干什么的,若未在作用域鏈中找到,則隱式的提升為全局變量;若找到定義的標(biāo)識符,則執(zhí)行之前的賦值操作,所以問題中的fn變量a的賦值,實(shí)際操作的是foo中的變量a并進(jìn)行了覆蓋賦值。

2017年12月27日 19:11