程序员代码改变世界Web 前端开发

今日头条面试总结——闭包和this

2017-04-10  本文已影响421人  简心豆

今天参加了今日头条的面试,好不容易过了笔试,却在一面就挂了。面完后真的想抽自己,关于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'

还有一些问题,这里就不一一例举了,感觉面试官会一直往深了问,绝对不止回答出来而已,如果你在哪个地方卡住了,他会立即换个问题,机会只有一次,好好把握。

上一篇下一篇

猜你喜欢

热点阅读