分类 默认分类 下的文章

JS是单线程的。所谓单线程,即在某一时刻,只能做一件事,需要做的一堆事情需要排着队,一个接一个的被处理。但是,如果做一件事所需要的时间太长了,那么将会阻塞后面事情的处理。比如你在等待一张图的加载,只能干等着,其他什么也做不了。显然,这种体验是非常不好的。因此为了解决这个问题,JS采用了事件循环的机制。

在JS中 首先将执行的代码,分为同步任务和异步任务。同步任务可以理解为瞬间完成,异步任务在异步队列中等待同步任务执行完成后,在进行执行。

异步任务又可以分为微任务(MicroTask)和宏任务(MacroTask)。微任务,优先执行,宏任务后执行。

三者都是用来改变this指向的

区别

bind fn.bind(obj) 返回一个新的函数,未进行调用,返回fn
call fn.call(obj,arg1,arg2...arg) 传递参数为多个,直接调用返回fn()
apply fn.apply(obj,Array) 传递两个参数,第二个参数为数组,直接调用返回fn()

性能上,据一些大神研究。当参数较少时(三个一下),三者的性能差不多。当参数较多时,call的性能较好。

    function Book(id,name){
        this.id=id;
        this.name=name;
    }
    const book1=new Book(1,'三国演义'); 
    const book2=Book(2,'西游记');
    
    console.log(book1);//Book {id: 1, name: "三国演义"}
    console.log(book2);//undefined
    console.log(id)//2
    console.log(name)//西游记

在js中,使用构造函数生成一个实例必须使用关键词new
new的作用 就是生成一个新的实例,并将构造函数的作用域赋给当前实例,this指向当前构造函数,并返当前实例。如果不使用关键词new直接调用构造函数,this指向的是全局的window对象,idname属性被挂在了window上(内存泄漏)。

在声明构造函数(类)时进行优化

    function Book(id, name) {
        if (this instanceof Book) {
            this.id = id;
            this.name = name;
        }else{
            return new Book(id,name)
        }
    }
    const book1 = new Book(1, '三国演义');
    const book2 = Book(2, '西游记');

    console.log(book1); //Book {id: 1, name: "三国演义"}
    console.log(book2); //Book {id: 2, name: "西游记"}

构造函数对this赋值之前,利用instanceof检查当前的this是否为构造函数的实例。如果是,则直接复制,不是的话,则使用构造函数new返回新生成的实例。

在项目开发中可能会遇见某些包文件依赖对有node的版本有所要求。重复安装的效率是十分低的,因此npm官方提供了一套node版本管理工具 n

全局安装n

npm install n -g

特别需要注意的是 大多数n命令,都必须使用 sudo否则会提示权限不足导致切换失败

安装长期支持维护的node版本

sudo n lts

安装稳定版本的node

sudo n stable

安装最新版本的node

sudo n latest

安装指定版本的node 

sudo n <版本号>

删除指定版本的node

sudo n rm <版本号>

但是,需要注意的是:不能删除当前版本,这样会导致操作失败。

切换node版本后,node版本号不变

添加环境变量
进入根目录
cd ~
ls -a 列出所有文件
找到 .bash_profile
打开编辑  vi .bash_profile
添加一下内容:

export NODE_HOME=/usr/local
export PATH=$NODE_HOME/bin:$PATH
export NODE_PATH=$NODE_HOME/lib/node_modules:$PATH

保存后 source .bash_profile重新加载环境变量配置即可解决