经典笔试题:循环依次拿下标的,你能写出多少种?

457 阅读1分钟

一、场景描述

image.png

有这样一个页面,上面4个按钮。点击按钮给用户弹出点击的是哪个~

聪明的小伙马上想到了,依次给做个下标,标记呗!

    <button onclick="alert(0)">按钮</button>
    <button onclick="alert(1)">按钮</button>
    <button onclick="alert(2)">按钮</button>
    <button onclick="alert(3)">按钮</button>
thread_111111_20201223130229_s_159672_w_500_h_845_96699.webp

解决问题的思路与业务描述也对应上了,但是面试官不满意。说JS不能与HTML耦合在一起

小伙又马上想到,这还不简单么?立马一顿操作,给我发offer吧~~~

    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    <button>按钮</button>
    var btns = document.getElementsByTagName('button')
     for (var i = 0; i < btns.length; i++) {
       btns[i].onclick = function () {
        alert(i)
      }
    }

面试官眉头紧锁~ 叫小伙当面测试一下!

image.png

小伙:怎么回事?不管点击哪个都弹出 “4”

0073Cjx6ly1gkya7kaaieg309c09f7wh.gif

面试官:要不今天就这样?回去等通知吧~

小伙大吼:不行,刚才是我粗心了,再来~

    var btns = document.getElementsByTagName('button')
     for (var i = 0; i < btns.length; i++) {
       btns[i].index = i //新增一行
       btns[i].onclick = function () {
        alert(this.index)
      }
    }

面试官:行,这算一种方法~ 还有吗? 起码要写出2种哦!~

小伙轻蔑一笑:这能难倒我?薛微展示一下闭包的写法吧,冲啊~

    var btns = document.getElementsByTagName('button')
     for (var i = 0; i < btns.length; i++) {
      (function(i){
           btns[i].onclick = function () {
            alert(i)
           }
      })(i)
    }

面试官:你小子,还有点东西啊,但是你怎么代码量越写越多呢? 能简便一下吗?

小伙:你就是想考我吧,那我就再送你一种,来吧~

    var btns = document.getElementsByTagName('button')
    for (var i = 0; i < btns.length; i++) {
         arr[i].onclick = new Function(`alert(${i})`);
    }

面试官:嗯!不错不错,就是代码比较怪异~ 能优化么?

小伙:好家伙,看来是时候展示真正的技术了!es6发光吧~

    var btns = document.getElementsByTagName('button')
     for (let i = 0; i < btns.length; i++) { //var 改成 let
           btns[i].onclick = () => alert(i)
     }

面试官: 可以啊,小兄弟~ 基本功还行。但是这些都是基本操作,还有其他方法吗?

小伙心想近日幸好刚看完《你不知道的JavaScript》,那就来吧~

    var btns = document.getElementsByTagName('button')
     for (let i = 0; i < btns.length; i++) {
         try{
             throw i
         }catch(i){
            btns[i].onclick = function () {
                alert(i)
            }
         }
    }

面试官:你今天是我面过最强的一个,我愿称你为最强实习生... 但是希望你再给我一点惊喜,还能写出一种,今天就录用你

小伙目露凶光,大喊一声:八门遁甲,夜凯~开~~~

    var btns = document.getElementsByTagName('button')
    for (let i = 0; i < btns.length; i++) {
      (btns[i].onclick = function () {
        alert(arguments.callee.i);
      }).i = i;
    }

面试官满意一笑:恭喜你通过考验!工资1500,明天直接过来吧~