美文网首页
每日一题(3)

每日一题(3)

作者: 欢欢小天使K | 来源:发表于2020-04-03 14:43 被阅读0次

来康康这道题吖

涉及到知识点:内存管理、windows、scope作用域、Hoisting变量提升、this、Arguments 对象

// 写出打印结果,并解释为什么
    let length = 10;
    function fn(){
        console.log(this.length);
    }
    var obj = {
        length: 5,
        method: function(){
            fn();
            arguments[0]();
        }
    }
    obj.method(fn, 1);

答案:

打印结果:0 2

考察知识点:

1、当函数作为对象里的方法被调用时,它们的 this 是调用该函数的对象。
2、在程序和方法的最顶端,let不像 var 一样,let不会在全局对象里新建一个属性。
3、arguments 是一个对应于传递给函数的参数的类数组对象。arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 .pop方法。但是它可以被转换为一个真正的Array
另外,typeof参数返回 'object'。

// arguments 对象只能在函数内使用
function test(a){
    console.log(a,Object.prototype.toString.call(arguments)); // "[object Arguments]"
    console.log(arguments[0],arguments[1]); // 1 undefined
    console.log(typeof arguments); // 'object'
}
test(1);

您还可以使用Array.from()将参数转换为真实数组:

var args = Array.from(arguments);
var args = [...arguments];

解答:

第一问:
函数 function(){ fn(); arguments[0](); }被调用,参数是fn,1;
然后执行fn( ),
这里执行fn( )的实际上是windows.fn();
所以fn();打印的window.length,即window原先就有的length属性:0
第二问:
arguments[0]()
也是调用fn,但是此时的fn是argument这个类数组对象的属性被调用的,所以打印的是arguments.length,即2。

相关文章

网友评论

      本文标题:每日一题(3)

      本文链接:https://www.haomeiwen.com/subject/upthphtx.html