文章目录
前言
以前看红宝书的时候,还真没注意。以为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);
输出结果:
按照往常的思维,第一个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。
总结
学习还得多留心,不然一不小心就掉坑里了。。。