您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页*每日一题(三七)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,

来源:保捱科技网

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

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 

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

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务