小宝宝也一看就会的JS优化技巧 | 青训营笔记

408 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的第4天

前言

基础不用看,直接上来做就行。——JiaFeiMiao

众所周知作为一名coder,你不能所有东西都等着人来教你,所以如果你不会JS基础的话,直接移步JavaScript 教程 | 菜鸟教程 (runoob.com)就可以了。

让前端的各种组件各司其职

众所周知前端是有三件套的。那么对于这三件套的协调就成了在实际工作中非常重要的内容。JS只是做脚本的,所以你最好不要直接用JavaScript去控制样式表,这是非常不好的习惯。假设我们现在有一个切换页面的昼夜模式的脚本:

const btn = document.getElementById('modeBtn');
btn.addEventListener('click', (e) => {
    const body = document.body;
    if(e.target.innerHTML === '🌞') {
        body.style.backgroundColor = 'black';
        body.style.color = 'white';
        e.target.innerHTML = '🌜';
    } else {
        body.style.backgroundColor = 'white';
        body.style.color = 'black';
        e.target.innerHTML = '🌞';
    }
});

你会发现我们是通过脚本的代码直接改变了颜色,这样的习惯其实是很不好的。我们可以优化一下:

const btn = document.getElementById('modeBtn');
btn.addEventListener('click', (e) => {
    const body = document.body;
    if(body.className !== 'night') {
        body.className = 'night';
    } else {
        body.className = '';
    }
});

现在我们是通过修改body元素的class属性,并且在样式表中根据对应的类名调整页面的样式。不过还可以进一步优化,因为我们根本不需要用JS脚本就可以达到我们想要的效果:

<input id="modeCheckBox" type="checkbox">
<div class="content">
    这里是正文
</div>
<style>
    #modeCheckBox:checked + .content {
        background-color: black;
        color: white;
    }
</style>

所以我们可以做出以下的总结:HTML/CSS/JS应该各司其责,应当避免不必要的由JS直接操作样式,可以用class来表示状态,纯展示类交互寻求零JS方案。

组件封装

如果我们想做一个首页的轮播图,我们应该怎么弄呢?那么最简单的一个思路是:我们用一个无序列表把所有的图片先展示出来,然后通过CSS把所有图片定位在一个位置,每隔一段时间切换相关图片的透明度。主要流程是:结构设计、展现效果、行为设计。

你会发现我们的代码耦合度太高,比如我想调整图片的地址或者调整每次轮换的时间之类,我们都需要去修改源代码,并且你需要三个部分一起动,这是不好的。

我们需要解耦,可以把各部分之间通过依赖注入的方式建立联系;也可以将HTML模板化,变的更利于扩展;也可以将组建的通用模型抽象出来。

过程抽象

JS作为一门函数式编程语言,我们可以对函数进行很多非常有用的操作。比如说我们在页面中有很多“只做一次”的操作,我们就可以把所有只做一次的操作剥离出来,放到一个对应的函数里,我们称其为过程抽象。

function once(fn) {
    return function(...args) {
        if(fn) {
            const ret = fn.apply(this, args);
            fn = null;
            return ret;
        }
    }

这种东西叫做高阶函数,它的特点是:以函数作为参数、以函数作为返回值。一般被用来做函数装饰器(函数中调用其他的函数)。这就属于软件工程学科的话题了,感兴趣的同学可以自己搜索一下相关的知识。

总结

因为这期课程抽象性和理论性更加的高,所以还是建议大家系统学习一下设计模式和软件工程,就可以在自己的实际工作中应用了。