美文网首页JsWeb前端之路让前端飞
前端面试题——方法的惰性载入

前端面试题——方法的惰性载入

作者: ac68882199a1 | 来源:发表于2017-04-09 14:44 被阅读86次

其实作者在被问到这个问题的时候也是一脸懵逼的,因为实际项目中并没有用到过【方法惰性载入】,所以就很老实地说了不了解

其实这个点在红皮书——《 js 高程 》里面是有过介绍的,那么下面就由作者带着小伙伴们一起探究一下,究竟什么是【方法的惰性载入】

什么是方法的惰性载入

说到 ”惰性“ ,第一个想到的应该是图片的懒加载,因为”惰“和”懒“是近义词,所以是不是就是说,惰性载入的方法和图片懒加载一样,都是到需要使用的时候才被加载的?其实并不是的

这里的惰性载入指的是,当这个方法中有多个 分支,如多个 if 分支时,只在第一次的时候进行条件判断,之后再次使用时就不进行判断

是不是有点蒙?既然是判断,难道不应该每次都进行判断么?为什么会有这种奇怪的需求?

其实并不难理解,我们平时写的判断因为判断条件可能会被改变,所以需要每次都进行判断;但是当我们判断的对象是一个在当前页面不会再次被改变的对象时,惰性载入的作用就显示出来了

举个栗子,一个视频播放的方法需要对不同的浏览器采取不同的对策,在 IE 中采用 flash ,而其他浏览器中不使用。由于除非换浏览器,否则是否是 IE 这个条件的值不会被改变,这样采用惰性载入,就可以在多次调用时有明显的优势

惰性载入的两种实现方式

还是以视频播放为例,假设一个变量表示当前浏览器是否为 IE

var isIE = true //当前为 非IE 浏览器

第一种 —— 方法调用时处理

function showVedio() {
    console.log('第一次调用 showVedio')

    if (isIE) {
        showVedio = function () {
            console.log('在 IE 中调用 showVedio')
        }
    } else {
        showVedio = function () {
            console.log('在 非IE 中国调用 showVedio')
        }
    }

    showVedio();
}

showVedio();
// 第一次调用 showVedio
// 在 非IE 中国调用 showVedio

showVedio();
// 在 非IE 中国调用 showVedio

showVedio();
// 在 非IE 中国调用 showVedio

上面的 showVedio方法在第一次调用时,进入了不是 IE 的判断,并重新为showVedio方法定义了一个函数,将原来的函数覆盖,这样之后再次调用时,showVedio会直接执行新的函数,而不会进入 if

第二种 —— 声明时即处理

var showVedio = function () {
    console.log('第一次调用 showVedio')

    if (isIE) {
        return function () {
            console.log('在 IE 中调用 showVedio')
        }
    } else {
        return function () {
            console.log('在 非IE 中国调用 showVedio')
        }
    }
}()
// 第一次调用 showVedio

showVedio();
// 在 非IE 中国调用 showVedio

showVedio();
// 在 非IE 中国调用 showVedio

showVedio();
// 在 非IE 中国调用 showVedio

通过立即执行函数,使函数在被声明时就执行,进入判断后返回一个新的函数,使其在被声明时就决定适当的函数

两种方式的对比

上文两种方式的基本原理是一样的,都是在第一次执行时,根据条件覆盖或返回一个新的函数,从而避免之后调用再次进行判断,提高了代码运行的效率

但是两种方式也存在一定的区别,很容易就能发现,第一种在加载时性能会更好,而第一次调用时会略微损耗性能;而第二种由于在加载时就已经执行,所以第一次调用的性能会更好,而加载时会稍差

惰性载入与普通多分支方法的区别

惰性载入能提高性能和效率,但并不是万能的,我们要知道他的使用情况比较单一:当前页面判断条件必须始终不变。如果条件会频繁改变的话,则必须使用普通多分支方法

扫码关注公众号

相关文章

  • 前端面试题——方法的惰性载入

    其实作者在被问到这个问题的时候也是一脸懵逼的,因为实际项目中并没有用到过【方法惰性载入】,所以就很老实地说了不了解...

  • 惰性载入函数

    因为浏览器之间行为的差异,多数JavaScript 代码包含了大量的if 语句,将执行引导到正确的代码中。看看下面...

  • 惰性载入函数

    以添加事件函数为例,有时需要通过 if 判断浏览器,进而决定如何调用添加事件函数。实际上对于同一个浏览器,在使用过...

  • 惰性载入函数

    思路: 方式一:第一次执行条件判断以后,覆盖原函数。(缺点,损失第一次的性能) 方式二:在声明函数时就指定适当的函...

  • 惰性载入函数

    惰性载入函数(跨浏览器兼容模式初次加载优化) 由于浏览器之间的行为差异,大多数js代码包含了大量if语句,比如下面...

  • JS高级函数

    高级函数 在 JavaScript 中使用函数的高级方法。 数据类型的安全检测 构造函数的安全作用域 惰性载入函数...

  • PHPer 面试指南-扩展阅读资源整理

    前端篇 收集的前端面试题和答案 前端开发面试题 史上最全的web前端面试题汇总及答案 前端工程师手册 HTTP协议...

  • PHPer 面试指南-扩展阅读资源整理

    前端篇 收集的前端面试题和答案 前端开发面试题 史上最全的web前端面试题汇总及答案 前端工程师手册 HTTP协议...

  • Web前端JQuery面试题(三)

    Web前端JQuery面试题(三) 1.怎么阻止冒泡过程? 2.ready()方法和onload()方法的区别? ...

  • 解析JavaScript惰性载入函数

    惰性载入函数表示函数执行的分支仅会发生一次,有两种实现惰性载入函数的方式,第一种是在函数被调用时再处理,在第一次调...

网友评论

    本文标题:前端面试题——方法的惰性载入

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