今天參加了今日頭條的面試,好不容易過了筆試胃碾,卻在一面就掛了涨享。面完后真的想抽自己,關(guān)于this和閉包明明是懂的仆百,可是面試官考察到這里的時候就有點懵厕隧,面試完不到五分鐘就知道了正確答案應(yīng)該是什么。怎么老這樣俄周,真的應(yīng)該張張記性了吁讨。由于剛面試完對題的記憶還是比較深的,題目如下:
一. 閉包
var funcs = [];
for (var i = 0; i < 5; i++){
funcs[i] = function (){
console.log(i);
};
}
第一問:funcs[2]();
執(zhí)行結(jié)果是什么栈源?
回答:=>5挡爵;
第二問:如下會輸出什么?
(function (){
var i = 9;
funcs[2]();
})();
回答:=>9甚垦,因為此時的i覆蓋了上面的i茶鹃,面試官也沒說啥,我以為對了艰亮,之后自己試了才知道闭翩,答案是5,很不能理解迄埃。去掉var聲明或者去掉立即執(zhí)行函數(shù)結(jié)果就是9疗韵。
因為在立即執(zhí)行函數(shù)里var i = 9;此時i是局部變量,閉包中i的引用不會訪問到立即執(zhí)行函數(shù)中的i侄非,所以就是5蕉汪;去掉立即執(zhí)行函數(shù)后,var i = 9;此時的i是全局變量逞怨,所以就覆蓋了原來的i者疤,所以輸出為9.
第三問:將第一個代碼改一下使funcs[2]()
輸出2
在這卡住了,也不知道為啥叠赦,明明很好改啊驹马,當時就腦子空空,方法有很多除秀,如下:
(1)立即執(zhí)行函數(shù)
for (var i = 0; i < 5; i++){
(function (j){
func[j] = function (){
console.log(j);
};
})(i);
}
在函數(shù)中糯累,傳參實際傳的是值,所以每次都傳的是i的值册踩;
(2)ES6中的變量聲明方法let
for (let i = 0; i < 5; i++){
func[i] = function (){
console.log(i);
};
}
在ES6中泳姐,用let就可以聲明塊級作用域,變量如同c和java中一樣執(zhí)行棍好;
(3)聲明一個函數(shù)并傳遞參數(shù)
function task(i){
func[i] = function (){
console.log(i);
};
}
for (var i = 0; i < 5; i++){
task(i);
}
最應(yīng)該想到的方法竟然一點都沒有想出來仗岸,就算不知道JS也應(yīng)該知道啊允耿。借笙。扒怖。
二. this
關(guān)于this問了個很簡單的題,我也沒回答出來业稼,如下:
function a(){
return this.name;
}
var b = {name: 'bbb'};
問題:如何使a返回b的name盗痒;
簡單吧,可是當時腦子死機了低散,硬是不知道怎么辦俯邓,只需一句話,代碼如下
function a(){
return this.name;
}
var b = {name: 'bbb'};
this.name = b.name;
console.log(a()); //'bbb'
還有一些問題熔号,這里就不一一例舉了稽鞭,感覺面試官會一直往深了問,絕對不止回答出來而已引镊,如果你在哪個地方卡住了朦蕴,他會立即換個問題,機會只有一次弟头,好好把握吩抓。