今天参加了今日头条的面试,好不容易过了笔试,却在一面就挂了。面完后真的想抽自己,关于this和闭包明明是懂的,可是面试官考察到这里的时候就有点懵,面试完不到五分钟就知道了正确答案应该是什么。怎么老这样,真的应该张张记性了。由于刚面试完对题的记忆还是比较深的,题目如下:
一. 闭包
var funcs = [];
for (var i = 0; i < 5; i++){
funcs[i] = function (){
console.log(i);
};
}
第一问:funcs[2]();
执行结果是什么?
回答:=>5;
第二问:如下会输出什么?
(function (){
var i = 9;
funcs[2]();
})();
回答:=>9,因为此时的i覆盖了上面的i,面试官也没说啥,我以为对了,之后自己试了才知道,答案是5,很不能理解。去掉var声明或者去掉立即执行函数结果就是9。
因为在立即执行函数里var i = 9;此时i是局部变量,闭包中i的引用不会访问到立即执行函数中的i,所以就是5;去掉立即执行函数后,var i = 9;此时的i是全局变量,所以就覆盖了原来的i,所以输出为9.
第三问:将第一个代码改一下使funcs[2]()
输出2
在这卡住了,也不知道为啥,明明很好改啊,当时就脑子空空,方法有很多,如下:
(1)立即执行函数
for (var i = 0; i < 5; i++){
(function (j){
func[j] = function (){
console.log(j);
};
})(i);
}
在函数中,传参实际传的是值,所以每次都传的是i的值;
(2)ES6中的变量声明方法let
for (let i = 0; i < 5; i++){
func[i] = function (){
console.log(i);
};
}
在ES6中,用let就可以声明块级作用域,变量如同c和java中一样执行;
(3)声明一个函数并传递参数
function task(i){
func[i] = function (){
console.log(i);
};
}
for (var i = 0; i < 5; i++){
task(i);
}
最应该想到的方法竟然一点都没有想出来,就算不知道JS也应该知道啊。。。
二. this
关于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'
还有一些问题,这里就不一一例举了,感觉面试官会一直往深了问,绝对不止回答出来而已,如果你在哪个地方卡住了,他会立即换个问题,机会只有一次,好好把握。
网友评论