在全域宣告的let

//宣告全域变数
var v = 'global'
let l = 'global'

//建立function
var obj={test:function(){return()=>{}}}
arrow=obj.test();

//显示对象属性
console.dir(window);
console.dir(obj.test)
console.dir(arrow);

在全域宣告的变数存哪

变数会存在[[scope]]里面,我们在window object底下看到用var宣告的变数,但没有看到用let
在widow object找宣告的全域变数var v 和let l
打开全域底下的function:test function
看到用let宣告的l,在[[scope]][0]:script
var宣告的变数,在[[scope]][1]:global window objecct
在test funtion找宣告的全域变数var v 和let l
所以let宣告的全域变数就是存在全域底下function的[[scope]][0]:script中吗?
倒也不完全正确,因为看arrow function也可以看到[[scope]][0]:script也有
在arrow function找宣告的全域变数var v 和let l

为甚麽function中可以引用到用let宣告的全域变数,但透过window.l却找不到

现在我们可以说明这个问题了:

  • 在function中找用let宣告的变数的流程:

    1. function的属性列表找到[[scope]]
    2. [[scope]]对应到scope chain列表
    3. scope chain[0][n]找变数
    4. [0]:script中找到l
  • 在function中,用window.l找用let宣告的变数

let l=5; 
console.log(window.l) //undefined

原因:在全域找l属性,找不到。
因为用let令的全域变数,从来都没有储存在window object上面过


<<:  Springboot 简介

>>:  [Day 14] 表格图页面建立

Day26 | 实现Extension内的MVVM架构

大家好,我是韦恩,今天是铁人赛的二十六天,让我们来设计extension中的MVVM架构吧! MVV...

Day 04-选择MongoDB

!小补充! SQL资料库: 关联式资料库,需在资料库中建立Table,并在Table与Table之间...

[Deploy to Render] 部署自己的 CodiMD/HedgeDoc

从发布第一篇 什麽是 Render 至今,转眼三个多月过去了,说好的更多范例和介绍持续 富奸 拖稿中...

Day23 订单金流 -- 状态异动

在订单成立以及建立金流部份,因为情境非常多, 因此在制定状态的部份其实也是有很多可以讨论的, 还记得...

JS 09 - 类别函式

大家好! 今天要介绍的是类别函式,就是将前几天的主题全都打包在一起的写法。 那麽油门踩下去吧! 物件...