其他分享
首页 > 其他分享> > 前段面试

前段面试

作者:互联网

  1. 转载自:https://www.cnblogs.com/yugege/p/6526215.html
  2. JS有哪些手段可以实现继承?
  3. 说说JS的闭包?
  4. 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)
  5. CSS实现矩形按钮右边缘的中间有个往里凹的小半圆,如图:button
  6. 为什么用vue而不用NG或者React?
<body>
    <ul>
        <li>test1</li>
        <li>test2</li>
        <li>test3</li>
        <li>test4</li>
        <li>test5</li>
        <li>test6</li>
        <li>test7</li>
        <li>test8</li>
        <li>test9</li>
        <li>test10</li>
    </ul>
    <script>
        var lis = document.querySelectorAll('ul li');
        for(var i = 0, len = lis.length; i < len; i++) {
            lis[i].addEventListener('click', function () {
                console.log(i);
            }, false);
        }
    </script>
</body>

你运行一下代码会发现,无论你点击哪个列表,控制台都是输出10。这是因为var声明的变量是函数作用域的,而不是块级作用域的。也就是说,for循环10次,每次都是改变同一个i,所以它的值会从0一直加到10。还有个问题是闭包导致的,闭包保存的是外部变量的引用,而不是值。也就是说,循环10次监听器创建了10 个闭包,它们里面的i引用的是同一个啊。所以全部都指向了10.
要解决这个问题有两种方法。一种是使用ES6的let来替代 var i = 0 里面的var, 因为let支持块级作用域。改成如下就正常了。

        for(let i = 0, len = lis.length; i < len; i++) {
            lis[i].addEventListener('click', function () {
                console.log(i);
            }, false);
        }

还有一种方法,就是很多经典书本都提到的,使用立即执行函数来切断闭包对外部变量i的引用:

        for(var i = 0, len = lis.length; i < len; i++) {
            (function (i) {
                lis[i].addEventListener('click', function () {
                    console.log(i);
                }, false);
            })(i)
        }

当然啦,如果对闭包不是很熟练,还可以通过事件委托来避开这个陷阱哈,代码如下:

        var ul = document.querySelector('ul');
        var lis = document.querySelectorAll('ul li');
        ul.addEventListener('click', function (e) {
            var target = e.target;
            if(target.nodeName.toLowerCase() === 'li') {
                console.log([].indexOf.call(lis, target));
            }
        }, false);

使用了事件委托,减少了监听器的绑定(只对列表的父亲元素监听),这种方法说不定还会加分呢。哈哈,我当时就是用这种方法来实现的,面试官可能觉得我的解法有点不寻常、顿时一脸蒙B,甚至还一度怀疑 console.log([].indexOf.call(lis, target)) 这段代码是不是有问题。直到后来我直接在他的笔记本跑了一遍,他才相信是正确的。


二面

然后,等待了一个多小时,轮到了二面。面试官大概三十多岁,可能是前端组长或者技术总监之类的职位吧。
他主要是问到了下面的这些问题:

  1. 说说JS的内存机制及垃圾回收机制
  2. 下面的代码有内存泄漏吗
var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
test.onclick = function() {
 test.innerHTML = user.name;
}
// ...后面还有很多其他操作,最后把user对象释放掉
user = null; // 释放对象
  1. 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符
    如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。
  2. http和tpc的关系,以及什么是https
  3. Node的特点(优点和缺点)
  4. 你在腾讯和网易实习期间学到的东西?
  5. 未来三年的职业规划

至于二面的问题都不是很难,下面简单的来看一下:

var user = {name: 'tom', age: 20, gender: 'male'}
var test = document.getElementByid('test')
(function (name) {
    test.onclick = function() {
        test.innerHTML = name;
    }
})(user.name);
user = null;

标签:闭包,function,JS,前段,面试,test,lis,var
来源: https://www.cnblogs.com/xiaoxiaodevlog/p/10682502.html