在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js作用域的問題

js作用域的問題

如何解釋下面的兩端代碼運(yùn)行結(jié)果

1

a中回調(diào)b,b打印x。b為什么拿不到a中的x;

let a=fn=>{const x=1;fn();};
let b=()=>{console.log(x)};

a(b);  //Uncaught ReferenceError: x is not defined

2

let a=fn=>{ x=1;fn();};
let b=()=>{console.log(x)};

x;   // Uncaught ReferenceError: x is not defined

a(b); // 1
回答
編輯回答
空痕

作用域是看文法環(huán)境的。在1中,首先b的函數(shù)作用域中沒有變量x的定義,然后就去作用域鏈的上層去找。這一步很關(guān)鍵,作用域鏈的上層是‘b函數(shù)定義’所在的環(huán)境,我們假設(shè)b函數(shù)是在全局定義的,那b函數(shù)作用域的上層就是全局作用域。很明顯在全局作用域下沒有x變量。 不同是是在2中,定義x時沒有用關(guān)鍵字,所以x還就是一個全局變量(也就是在demo和面試題中這么寫,項(xiàng)目中會被罵死的)

2017年3月12日 21:15
編輯回答
青瓷

變量的作用域鏈?zhǔn)强茨阍诖a中聲明變量時候定好的,和執(zhí)行時候的讀取變量的位置無關(guān)。
當(dāng)程序執(zhí)行,讀取到這個變量時候,就按照聲明時候定好的作用域鏈進(jìn)行尋找。

2018年5月19日 01:08
編輯回答
夏夕

因?yàn)槟懵暶骱瘮?shù)的地方都是在外部,所以只能取到最外層的變量,而你第二個x沒有加var或let,默認(rèn)是一個全局的變量。

2018年4月25日 15:43
編輯回答
夏木

箭頭函數(shù)的作用域問題

2017年3月30日 23:08
編輯回答
痞性

這個問題主要是箭頭函數(shù)的作用域問題。

箭頭函數(shù)的作用域在定義時就綁定好了。

第一題:

  • 執(zhí)行a(b)
  • a函數(shù)中定義x變量,并執(zhí)行b
  • 但b函數(shù)的作用域,在定義時就已經(jīng)綁定為window,window中沒有x,故報錯,x is not defined。

第二題:

  • 打印x,這是兩個函數(shù)都沒執(zhí)行,故報錯,x is not defined。
  • 執(zhí)行a(b)
  • a函數(shù)中直接給x賦值,由于沒有聲明,會直接賦值到window對象上,這時window.x = 1。
  • 執(zhí)行b,b的作用域在window,所以自然就能打印出x
2017年2月20日 13:45