let栽燕、const定義的變量為什么通過window獲取不到

let吱型、const定義的變量為什么通過window獲取不到

先看幾個case:

let count = 10

console.log(count)
console.log(window.count)

輸出:10 undefined

const length = 5
const obj = {
  length: 6,
  foo(bar) {
    bar()
    arguments[0]()
  }
}

function bar() {
  console.log(this.length)
}

obj.foo(bar, 2, 4)

輸出: 0 3

var length = 5
const obj = {
  length: 3,
  foo(bar) {
    bar()
    arguments[0]()
  }
}

function bar() {
  console.log(this.length)
}

obj.foo(bar, 3)

輸出: 5 2

為什么赤屋?ES5 和 ES6變量聲明方式的區(qū)別導致的。首先總結下ES5 和 ES6 的變量聲明方式师逸。

  1. ES5 變量聲明方式就兩種 var司倚、function
  2. ES6 有 let、const篓像、import动知、class,再加上ES5 的var 和 function 總共6種
  3. DOM 的頂層對象是document员辩,BOM的頂層對象是window盒粮,Node的全局對象是global
  4. ES5中頂層對象的屬性等價于全局變量
  5. 在ES6中,用let奠滑、const丹皱、import、class定義的全局變量并沒有作為全局對象的屬性宋税,所以通過window獲取時种呐,如果window存在和變量同名的屬性,則獲取的是window中該屬性的原始值弃甥,否則為undefined
  6. 用let const在聲明的時候,是創(chuàng)建了一個遮蔽window同名屬性的全局變量汁讼,debuger一下就可以看出來用 let const 定義的變量作用域為Script對象中淆攻,和Window/Global同級。

如圖:

Markdown

所以

  1. case1首先打印10嘿架,其次是window中不存在的count屬性瓶珊,undefined
  2. case2 調(diào)用bar時,this指向window耸彪,而window中的length屬性為0伞芹,所以輸出0。通過arguments[0]調(diào)用蝉娜,函數(shù)內(nèi)的this指向argument唱较,arguments為類數(shù)組,其length屬性為實參的個數(shù)召川,即 3
  3. case3 使用var聲明length南缓,會修改window中的length屬性(window的length 屬性的原始值是當前窗口中frames的數(shù)量(包括IFRAMES)),所以值為0

暫時性死區(qū)(TDZ)

let const聲明的變量會放在TDZ中荧呐,TDZ指的是從變量的當前的作用域開始到變量的聲明之間的區(qū)域汉形,這一段區(qū)域的變量是無法讀寫的纸镊。只有在執(zhí)行了聲明之后,才從TDZ移除概疆。

注意點:

變量提升控制的是當前作用域或者執(zhí)行環(huán)境逗威,因此某個TDZ也只負責某個執(zhí)行環(huán)境。

console.log(typeof value)  // undefined

{
  console.log(typeof value) // 報錯 value is not defined
  const value = 'rose'
}

可以看出if外訪問 value 不會報錯岔冀,因為 if 外 typeof value時變量還沒有在TDZ中凯旭,所以是undefined。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楣颠,一起剝皮案震驚了整個濱河市尽纽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌童漩,老刑警劉巖弄贿,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矫膨,居然都是意外死亡差凹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門侧馅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來危尿,“玉大人,你說我怎么就攤上這事馁痴∫杲浚” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵罗晕,是天一觀的道長济欢。 經(jīng)常有香客問我,道長小渊,這世上最難降的妖魔是什么法褥? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮酬屉,結果婚禮上半等,老公的妹妹穿的比我還像新娘。我一直安慰自己呐萨,他們只是感情好杀饵,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垛吗,像睡著了一般凹髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怯屉,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天蔚舀,我揣著相機與錄音饵沧,去河邊找鬼。 笑死赌躺,一個胖子當著我的面吹牛狼牺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼患,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼是钥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缅叠?” 一聲冷哼從身側響起悄泥,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肤粱,沒想到半個月后弹囚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡领曼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年鸥鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庶骄。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁渗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出单刁,到底是詐尸還是另有隱情灸异,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布羔飞,位于F島的核電站绎狭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褥傍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一喇聊、第九天 我趴在偏房一處隱蔽的房頂上張望恍风。 院中可真熱鬧,春花似錦誓篱、人聲如沸朋贬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锦募。三九已至,卻和暖如春邻遏,著一層夾襖步出監(jiān)牢的瞬間糠亩,已是汗流浹背虐骑。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赎线,地道東北人廷没。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像垂寥,于是被迫代替她去往敵國和親颠黎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容