*每日一题(三七)let length = 10 function fn(){ console.log(this.length) } var obj = { length:5,

题目描述:写出打印结果,并解释为什么

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 属性返回当前窗口中包含的框架数量(框架包括frameiframe两种元素).

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

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/105275884