美文网首页程序员代码改变世界Web 前端开发
今日头条面试总结——闭包和this

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

作者: 简心豆 | 来源:发表于2017-04-10 20:20 被阅读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'
    

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

    相关文章

      网友评论

        本文标题:今日头条面试总结——闭包和this

        本文链接:https://www.haomeiwen.com/subject/ofjeattx.html