题目描述:写出打印结果,并解释为什么
let length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length:5,
method:function(fn){
fn();
arguments[0]();
}
};
obj.method(fn,1);
答案:
0
2
解析:
1.fn()知识点:任意函数里如果嵌套了 非箭头函数,那这个时候,嵌套函数里的 this 在未指定的情况下,应该指向的是 window 对象,所以这里执行 fn 会打印 window.length,但是 let 声明变量时会形成块级作用于,且不存在变量提升,而 var 存在声明提升。所以当使用 let 声明变量时,length 属性实际上并没有添加到 window 对象中。
//例如在浏览器控制台
let a = 1;
window.a //undefined
var b=1;
window.b //1;
但是这里为什么输出 0 呢,因为 window 对象原先上有 length 属性,所以输出的是原先的值 0
补充一点,0 不是太严谨,window.length 属性返回当前窗口中包含的框架数量(框架包括
frame
和iframe
两种元素).
2.argumengs[0]() 知识点:在方法调用(如果某个对象的属性是函数,这个属性就叫方法,调用这个属性,就叫方法调用)中,执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内 this 的指向。(通俗的说,调用谁的方法 this 就指向谁)
这里 arguments[0]() 是作为 arguments 对象的属性 [0] 来调用 fn 的,所以 fn 中的 this 指向属性访问主体的对象 arguments
//例如
[function fn(){
console.log(this.length)
}][0]();//1
//数组也是对象,只不过数组对象的整型会计入 length 属性中,
//并被区别对待,这里就是调用数组对象的 0 属性,函数作为数组对
//象的属性调用,函数中的 this 当然指向这个数组,所以返回数组的 length
这里还有一点要注意,arguments 这个参数,指的是 function 的所有实参,与形参无关。也就是调用函数时,实际传入的参数,fn 与 1 作为一个参数存储在 arguments 对象里,所以 arguments 的长度为2,所以输出 2