小米的两道闭包面试题

zhoulei阅读(71)

网上看到了这两道题,都挺有意思的,记录~

repeat 函数

// 题目要求!

function repeat (func, times, wait) {
}
// 这个函数能返回一个新函数,比如这样用
var repeatedFun = repeat(alert, 10, 5000)
调用这个 repeatedFun ("hellworld")
会alert十次 helloworld, 每次间隔5秒

网上给的是 setInterval 的写法,不过考虑到 setInterval 返回值容易忽忽悠悠,还是用 setTimeout来写。

function repeat(func, times, wait) {
    return function () {
      var num = 0
      // 保存传参, 以便在 handler 中使用
      var _arguments = arguments

      function handler() {
        // 注意此处次数
        if (num < times) {
             num++
          func.apply(null, _arguments)
          setTimeout(handler, wait)
        }
      }

      setTimeout(handler, wait)
    }
  }

这个题考察了闭包和 setTimeout 模拟 setInterval 的用法,因为最终要在 handler 方法中执行func,所以要保存 arguments 对象以便下面的闭包函数调用。

次数也踩了坑,递归调用一定要注意终止条件,本来 num++写在 if 之外,觉得不太妥当,还是放在里面。

stringconcat 函数

// 题目要求!
var result1 = stringconcat("a", "b")  //result1 = "a+b"
var stringconcatWithPrefix = stringconcat.prefix("hellworld");
var result2 = stringconcatWithPrefix("a", "b")  // result2 = "hellworld+a+b"

一看就比第一个复杂。答案还写了 merge 函数,还有 for 循环什么的,测试用例看起来并没有这么复杂, so给出自己的答案。

 function stringconcat() {
    return Array.prototype.slice.call(arguments).join('+')
  }

  stringconcat.prefix = function (str) {
    return function () {
    // 这个 str参数挺有意思的
      var arr = [str].concat(Array.prototype.slice.call(arguments))
      return stringconcat.apply(null, arr)
    }
  }

看似 stringconcat.prefix()返回的只是一个 function,但实际还是保存了外层传进来的参数形成闭包。

另一个坑就是 return function(){}中,不要忘记把 stringconcat.apply的结果 return 回去,一开始我因为没有加 return 导致折腾了一下午!!!

参考

分享小米的两道面试题

一件蛋疼的事 v-click

zhoulei阅读(63)

之前写完博客的响应式布局就在想怎么优化移动端300ms 问题,简单搜索以后觉得自己写个 touchstart-touchend/click 自动判断绑定的插件吧,然后就写了,写了就蛋疼了。。。

vue-router 的 v-link 默认绑定 click 事件,根本不给机会。。。意味着这个插件的写法没法和 vue-router 一起使用,博客上只好上 fastclick 了,虽然我觉得我这么 low的博客根本没必要用这么高大上的东东,不过压缩后只有不到4k,(哎呦这个库还不错!)嗯。

写都写了,发出来吧~主要是抄袭了网红二哲的 v-tap,尤大大的 v-touch,自己写插件来练练手,又给上帝交了学费。

v-click 简介

思路就是根据 navigator.userAgent 信息判断是否是 pc 端,从而绑定相应的事件。暂时只有 touchstart 和 touchend,不过好像应该判断一下是否pageX需要移动?okok Anyway,暂时用不到,拖延症开始高并发了。

安装

// main.js (v-click.js地址都不好意思发出来了)
import VueClick from './directives/v-click.js'

Vue.use(VueClick)

心路历程(被虐の路)

二哲在 segmentfault 发文说没查到 isFn 这个属性,特意搜了一下还是有文档的,翻译出来放这儿。

Directives In Depth

Vue.js 鼓励开发者从行为中分离数据,所以实例方法应该写在 methods 里而不是 data 对象中。这会导致 data 对象中的函数将被忽略,同时普通指令也无法绑定这些函数。

如果想在自定义指令中传入函数,你需要增加 isFn 选项:

Vue.directive('my-handler', {
    isFn: true, // important!
    bind: function () {
        // ...
    },
    update: function (handler) {
        // the passed in value is a function
    },
    unbind: function () {
        // ...
    }
})

增加isFn:true这个选项也使自定义指令像 v-on 指令一样,可以接受内联表达式。

参考资料

最后

fastclick 真爽哈哈哈哈哈

9周减脂计划

zhoulei阅读(52)

最近两个月陆续拿到了一些 sp offer,也不负众望取得中期答辩不过的头彩,稀里糊涂的度过了九月十月,身体力量虽然小幅提高,但频率已经降到两天一练甚至两天都不能一练的境况,得过且过的现象简直抓瞎。十一月的目标是完成大论文实际内容,健身方面是把 体脂从16%降到10%,力量保持不掉。

目前身体情况

zsy状态
身高178cm
年龄今年我18
体重76.8kg
体脂16%左右
深蹲120kg x 3
硬拉140kg x 5
卧推80kg x 4
基础代谢1700卡左右
TDEE2500卡左右

体脂略高,其余状态还不错。热量缺口设置为500卡。

饮食

基本营养规划

营养素标准总量
蛋白质1.8g/kg135g左右
碳水前三周2.5g/kg190g左右
中间三周2g/kg150g左右
最后三周 1.5g/kg110g左右
脂肪0.8-1g/kg50-70g

Macro 方面选择比较稳妥的方案,蛋白碳水的比例都是经过实际检验的。

学校固定饮食

早餐重量蛋白质碳水脂肪
weet-bix 麦片33g逼死强迫症~
三元无蔗糖酸奶180g
myprotain40g
热量372大卡42g32g9g
零食小吃重量蛋白质碳水脂肪
杏仁20颗
三元无蔗糖酸奶180g
myprotain40g
热量370大卡42g12g17g
~重量蛋白质碳水脂肪
总热量742大卡84g44g26g

除去早餐和零食小吃,意味着前三周其他两餐和加餐要控制在1300卡以下,遵照碳水后进原则,午餐尽量控制碳水,练后集中摄取。非训练日要管住嘴!

训练

zsy分化
第一天背背
第二天手臂
第三天腿肩
第四天休息

练三歇1,绝对前所未有的刺激,大重量符合动作为主,组间30s-90s,基本容量30组。训练没什么可说的,突破极限就好。三周后会改动计划,逐渐增加有氧,进一步破坏身体适应性。

总结

如果一生只有一次翻身的机会,那就用尽全力吧 ##翻滚吧!阿信#

寻找有兴趣的合伙人,加入我们吧!

加入我们