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

作者分享了一次今日头条面试的经历,重点回顾了闭包和this指向的问题,对于闭包中变量的作用域和this绑定的理解进行了深入剖析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值