let和const定义的变量在哪?在Script这个域中

246 阅读1分钟

let声明的变量不在window在哪里呢?

var a=0;
let b=1;
console.log(a); // 0
console.log(b); // 1
console.log(window.a); // 0
console.log(window.b); // undefined

打开chrome console

var a=0;
let b=1;
debugger;

  • 可见let的变量是存在于Script Scope
  • 可见Global Scope是Window构造函数创建出来的
  • Global Scope前半段已经有我们var的a
  • 这是Global Scope的后半段,有我们熟悉的window对象
  • 其中还有一个我们var的a
  • 依次推断,这才是我们平时window.a的真实所在

或者直接打印函数也可以看出

demo1

// 研究add函数的作用域
var a=0;
var b=0;
function add(){
 var c=0;
}
console.dir(add);

  • add函数的[[Scopes]]只有一个内容就是Global,a与b两个变量挂在add函数的Global作用域上因为他们是随时可用的
  • 由于只是窥探add,所以是看不出c挂在哪个作用域的

demo2

// 研究add1函数的作用域
var a=0;
var b=0;
function add(){
 var c=0;
 function add1(){ c=0;}
 console.dir(add1);
}
add();

  • add1函数的[[Scopes]]有两个内容 Closure与Global
  • 因为add1内部引用着外部变量c

demo3

// 看看let const var 分别在哪里
let a=0;
const b=0;
var c=0;
function add(){
}
console.dir(add);