來康康這道題吖
涉及到知識點:內(nèi)存管理垂睬、windows胧卤、scope作用域拼岳、Hoisting變量提升况芒、this、Arguments 對象
// 寫出打印結(jié)果绝骚,并解釋為什么
let length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function(){
fn();
arguments[0]();
}
}
obj.method(fn, 1);
答案:
打印結(jié)果:0 2
考察知識點:
1、當(dāng)函數(shù)作為對象里的方法被調(diào)用時粪牲,它們的 this 是調(diào)用該函數(shù)的對象止剖。
2、在程序和方法的最頂端穿香,let不像 var 一樣,let不會在全局對象里新建一個屬性焙蚓。
3、arguments 是一個對應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對象购公。arguments
對象不是一個Array
雁歌。它類似于Array
,但除了length屬性和索引元素之外沒有任何Array
屬性将宪。例如橡庞,它沒有.pop
方法印蔗。但是它可以被轉(zhuǎn)換為一個真正的Array
。
另外吧趣,typeof參數(shù)返回 'object'耙厚。
// arguments 對象只能在函數(shù)內(nèi)使用
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()
將參數(shù)轉(zhuǎn)換為真實數(shù)組:
var args = Array.from(arguments);
var args = [...arguments];
解答:
第一問:
函數(shù) function(){ fn(); arguments[0](); }
被調(diào)用,參數(shù)是fn薛躬,1;
然后執(zhí)行fn( ),
這里執(zhí)行fn( )的實際上是windows.fn()
;
所以fn();打印的window.length
八匠,即window原先就有的length屬性:0
第二問:
arguments[0]()
也是調(diào)用fn趴酣,但是此時的fn是argument這個類數(shù)組對象的屬性被調(diào)用的梨树,所以打印的是arguments.length
岖寞,即2。