let和const的变量声明不在window对象上

文章目录


前言

以前看红宝书的时候,还真没注意。以为var,let,const都是一样,在全局作用域下声明之后,都会成为window的对象。今天写代码的时候,才发现为啥let全局作用域下定义的变量,window上却获取不到。又翻开红宝书看了一下,才发现以前忽略的知识点:与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)

去搜了一下,发现一些面试题

let len = 10;
function fn() {
	console.info(this.len)
}
fn();
let Person = {
	len: 5,
	say: function() {
		fn();
		arguments.len = 20;
		arguments[0]();
	}
}
Person.say(fn);

输出结果:
let和const的变量声明不在window对象上

按照往常的思维,第一个this.len的输出,我肯定会写10;现在看,肯定输出的是undefined。第二个仍输出undefined,如果这样修改下,改变内部的this指向,fn.call(Person);那么输出5;arguments是伪数组,fn当参数传递,所以arguments[0]指的就是fn()函数,所以arguments[0]();相当于执行了一次fn()函数;因为arguments上面挂载了len属性,在数组中只不过使用数字作为属性名的方法,arguments[0]() ----->arguments.0(),所以其中this指向arguments。
let和const的变量声明不在window对象上


总结

学习还得多留心,不然一不小心就掉坑里了。。。

上一篇:js基础函数(下)(小白自用5)


下一篇:【JDK1.8】JUC——LockSupport