来康康这道题吖
涉及到知识点:内存管理、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。