JS底层机制小白入门_机制小白基础

JavaScript的执行机制-eventloopsetTimeout(function(){console.log(‘set1’);
})new Promise(function(resolve){ console.log(‘pr1’); // 相当于同步代码resolve()
}).then(function(){console.log(‘then1

JS底层机制小白入门

JavaScript的执行机制-eventloop

setTimeout(function(){
    console.log('set1');
})

new Promise(function(resolve){  
    console.log('pr1');  // 相当于同步代码
    resolve()
}).then(function(){
    console.log('then1');
})

setTimeout(function(){
    console.log('set2');
})

new Promise(function(resolve){  
    resolve()
}).then(function(){
    console.log('then2');
})

console.log(3)
// 微 ['then1','then2'],宏 ['set1','set2']
// pr1 3 then1 then2 set1 set2
// 增强版
setTimeout(function(){
    console.log('set1');
    new Promise(function(resolve){  
        resolve()
    }).then(function(){
        console.log('then3');
    })
})

new Promise(function(resolve){  
    console.log('pr1');  // 相当于同步代码
    resolve()
}).then(function(){
    console.log('then1');
})

setTimeout(function(){
    console.log('set2');
})

new Promise(function(resolve){  
    resolve()
}).then(function(){
    console.log('then2');
})

console.log(3)
// 第一遍 微 ['then1','then2'],宏 ['set1','set2']
// 第2遍,执行宏任务时会再次把微任务插入到微任务队列 微 ['then3'],宏 ['set1','set2']
// pr1 3 then1 then2 set1 then3 set2

JS底层机制小白入门_机制小白基础

JS底层机制小白入门_机制小白基础

微任务:Promise,process.nextTick宏任务:整体代码script,setTimeout,setInterval

微任务会先于宏任务执行

微任务队列空了才去执行下一个宏任务

async function a(){
    console.log('async')
}
a();
console.log(3)  // async 3
async function a(){
    // await 从使用上来说,必须等待一个promise
    var b = await new Promise(function(resolve){
        resolve(7)
    })
    console.log(5)
    console.log(b)
}
a();
console.log(3)   // 3 5 7
for(var i = 0; i < 10; i++){
    setTimeout(() => {
        console.log(i)
    });
}
// 10次10

// 闭包解决
for(var i = 0; i < 10; i++){
    (function(i){
        console.log(i)
    })(i)
}
// 最好是使用let形成块级作用域

作用域链与引用类型

var a = [1,2,3]
function f(){
    a[3] = 4;
    a = [100];
}
f();
console.log(a)  // [100]
var a = [1,2,3]
function f(a){
    a[3] = 4;
    a = [100];
}
f(a);  
console.log(a)  // [1,2,3,4]
// 解读
var a = [1,2,3]
function f(a){
    var a = a;  // 隐式有句代码 把外部的a 赋值给 局部的a
    a[3] = 4;  // 因为是引用类型,外部的a和内部的a都变成 [1,2,3,4]
    a = [100];  // 给局部的a赋值,局部的a切断了和外部a的联系
    console.log(a)  // 打印的是局部的a [100]
}
f(a);  
console.log(a)  // 是全部的 a [1,2,3,4]  

原理:

对象是引用类型

let a = [1,2,3];
let b = a;  // 是把数组的内存地址指向b
a[3] = 4; // 所有修改a b也会变,因为内存地址变掉了

参数在方法内,相当于一个局部变量

思考:

问题一:js是如何查找变量的?

从当前作用域出发,逐级向上查找,直到window,如果window也没有,那就是undefined

var c = 123;
function a(){
    console.log(c);  // 123
}
var c = 123;
function a(){
    var c = 456;
    console.log(c);  // 456
}
问题二:JavaScript的数组并不是数据结构意义上的数组,为什么?

数据结构意义上的数组是连续相等的内存变量,定义的时候就规定大小,类型真正的数组是不可以扩容的。

问题三:数据结构上扩容一个数组,内存做了啥?

重新申请一个要扩容大小的内存再把扩容前的内容复制过来,然后再写入要扩容的内容

难题来喽

var a = {
    n: 1
}
var b = a;
a.x = a = {
    n: 2
}
console.log(a.x);  // undefined
console.log(b.x);  // {n: 2}
// 解析
var a = {
    n: 1
}
var b = a;
// a.x .号运算优先级别最高
// a.x 会在原来的内存地址中,申请一块新的内存地址
a.x = a = {
    n: 2
}

JS底层机制小白入门_机制小白基础

V8引擎内存问题

var size = 20*1024*1024;
var arrAll = [];
for(var i = 0; i < 20; i++){
    arrAll.push(new Array(size));
}

知识点:v8引擎64位只有1.4g的内存可以支配,node可以使用C加加的内存,node源码是用c++写的

内存如何回收?

JS底层机制小白入门_机制小白基础

为什么等内存满了后才回收?

因为JavaScript进行一次回收要把整个js暂停,所以不能经常回收,回收100m内存,大概需要10ms

内存查看

浏览器 window.performanceNode process.memoryUsage()

function getMemory() {
    var mem = process.memoryUsage();
    var format = function(bytes) {
        return (bytes / 1024 / 1024).toFixed(2) + "MB";
    }
    console.log('heapTotal' + format(mem.heapTotal) + 'heapUsed:' + format(mem.heapUsed));
}

var size = 20 * 1024 * 1024;
var arrAll = [];
for (var i = 0; i < 20; i++) {
    getMemory();
    arrAll.push(new Array(size));
}

如何解决

如果不确认自己的数据放在全局是不是很大,可做一些大小的限制

var size = 20 * 1024 * 1024;
var arrAll = [];
for (var i = 0; i < 20; i++) {
    if(arrAll.length > 4){
        arrAll.shift();
    }
    arrAll.push(new Array(size));
    getMemory();
}

可以看出,虽然数据进行了限制,被删除了,还是在内存中的,还没有被回收,直到内存快满的时候才进行的回收,把没用的回收掉,内存才回归到一个真实可使用的状态

总结:在用node写服务时,只要服务开着,全局就不会回收

容易引发内存使用不当的场景

滥用全局变量缓存不限制操作大文件

海计划公众号
(0)
上一篇 2020/03/23 01:36
下一篇 2020/03/23 01:37

您可能感兴趣的内容

  • 2019最新网络赚钱方法有哪些?推荐几种靠谱赚钱方式!指南教程_网络小白指南

    2019年已经是互联网发展的成熟期了,随着网络的不断发展,以及手机应用的普及,几乎人人都已经会使用网络工具。但是又有多少人知道网络赚钱这个小众的赚钱方式呢?今天就来给大家介绍下2019年几种比较常见的网络赚钱方式:1、自媒体写作:大家都知道新的时代,自媒体逐渐发展了起来,很多热爱写作的朋友就有用武之地啦!喜欢写作的朋友可以申请微信公众号,或者最近比较火热的今

    2020/03/31
  • px是什么单位?菜鸟攻略_单位基础入门

    px是pixel的缩写,是像素单位,也是为影像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“画像元素”之意,有时亦被称为pel(picture element)。px是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定

    2020/03/22
  • Mac上程序员很喜欢用10大开发软件使用指南_工具基础知识入门

    走进BAT,你们会发现,他们都喜欢使用Mac,Mac作为一个创作工具,一直深受程序员,教授,高科技行业从业者的喜欢。Mac及佳的稳定性,也是用户喜欢的一个主要原因,Mac可以让你专注于创作,跟iPhone一样,Mac没有那么多流氓软件和弹窗。提高了我们工作效率。Mac围绕着创作的生态,也是Mac让我撇开Windows没有丝毫的不适应的关键,下面我为大家推荐一

    2020/03/20
  • Cerebral基础入门_一个 JavaScript MVC 应用程序状态管理器

    Cerebral基础入门 官方网址:https://cerebraljs.com/ GitHub:https://github.com/cerebral/cerebral 简介描述…

    2020/03/06
  • 阻止移动端浏览器点击图片会预览的几种方法小白教程_移动端零基础入门

    在移动端部分浏览器中点击了图片,变成了查看图片的效果,怎么防止img的图片被手机浏览器的图片查看器打开呢?下面整理了一些方法来实现。1、1.在img元素上添加 onclick=”return false”2、背景图的方式插入(这种是比较普遍的方式)backgr

    2020/04/05
  • 哪种方式更适合在React中获取数据?小白攻略_数据入门百科

    当执行像数据获取这样的I/O操作时,你必须发起获取请求,等待响应,将响应数据保存到组件的状态中,最后渲染。异步的数据获取会要求额外的工作来适应React的声明性,React也在逐步改进去最小化这种额外的工作。生命周期函数,hooks和suspense都是React中获取数据的方式,我将在下面的示例中分别讨论它们的优缺点。只有了解每种方式的具体细节才能帮助你更

    2020/03/23
  • javascript作用域有几种类型?小白基础_作用域新手入门

    作用域是可访问的变量的集合;在JavaScript中,作用域为可访问变量,对象,函数的集合。那么在JavaScript中有几种作用域类型?下面本篇文章就来给大家介绍一下,希望对大家有所帮助。javascript作用域有两种类型:局部作用域、全局作用域。全局作用域(Global Scope)变量在函数外定义为全局变量,全局变量有局作用域:网页中的所有脚本和函数

    2020/03/24
  • rapid.js基础知识教程_类似ORM的接口和用于API请求的路由器

    rapid.js基础知识教程 官方网址:https://rapidjs.drewjbartlett.com GitHub:https://github.com/rapidjs/ra…

    2020/03/07
  • NPM 已成为世界上最大的包管理器菜鸟教程下载_npm基础教程

    Node.js项目的NPM是世界上最大的包管理器,登记了超过35万软件包,是排名第二的Apache Maven的两倍以上。用户在四周时间里从NPM安装了180亿个软件包,但记录的下载次数只有60亿次,原因是三分之二的安装来自缓存。每周大约有160名开发者首次在NPM发表软件包,Node.js的 Ashley Williams 预测2017年这一数字将达到平均

    2020/04/05
  • Vue中你可能认为是bug的情况原来是这样的入门百科_bug使用说明

    Vue中你可能认为是bug的情况原来是这样的入门百科 前言 我们知道Vue框架剧本双向数据绑定功能,在我们使用方便的同时,还有一些细节问题我们并不知道,接下来一起探讨一些吧 双向数…

    2020/03/19
  • 低效率开发人员的4种坏习惯基础入门_效率小白指南

    我们都有不好的习惯,地球上没有一个人是完美的。作为开发人员,不良习惯会严重影响您的效率,也会影响您周围的人。Jack Canfield说:“习惯将决定您的未来”。想要成长为一名开发人员,就必须改掉不良习惯。如果您可以做到,效率将大大提高。让我们看看您应该尽快改掉的坏习惯。永远说“是”首先声明一点,对所有事情都说 是 谦虚且无私的,这意味着您愿意(可能需要付出

    2020/03/23
  • Js计算平均值的不同实现方式零基础入门_运算使用攻略

    本文翻译并严重删减自five-ways-to-average-with-js-reduce/如果我们有以下数组:需求是先过滤掉 found 为 false 的 item 再计算求平均值const victorianSlang = [{term: “doing the bear”,found: true,popularity: 108},{term: “kat

    2020/03/29
  • 功能强大的 JS 文件上传库:FilePond入门基础_库入门百科

    本文作者:HelloGitHub- kalifun这是 HelloGitHub 推出的 《讲解开源项目》 系列,今天给大家推荐一个 JavaScript 开源的文件上传库项目——FilePond一、介绍1.1 FilePond它是一个 JavaScript 文件上传库。可以拖入上传文件,并且会对图像进行优化以加快上传速度。让用户体验到出色、进度可见、如丝般顺

    2020/03/26
  • 实现移动端响应式布局入门基础_响应式菜鸟教程下载

    单位选择: vw 还是 rem ?我们选择了 rem 作为像素单位。因为本次开发的项目包含 ipad 与手机端,使用 rem 单位应对的根元素字体可以根据设备动态设置。因此 ipad 端与手机端公共的样式只需要写一套代码就能实现,而使用vw作为单位在无论什么情况下都需要写2套样式,见下面的例子:假设现在2倍视觉稿上有一个显示 500*300 的按钮,而这个按

    2020/03/29
  • Fluid UI基础知识入门_一款用于移动App应用软件开发的原型设计工具

    Fluid UI基础知识 官方网址:https://www.fluidui.com/ 简介描述:一款用于移动App应用软件开发的原型设计工具 Fluid UI就是一款用于…

    2020/03/06
  • Web前端开发需要掌握了解的工具、技术小白知识_工具使用帮助

    Web的发展日新月异,这也使得Web开发者不得不加快脚步,学习新的技术和编程语言。尤其是对于那些大量流量入口的网站来说,跟上技术发展趋势更是尤为重要。为了使得Web开发人员能够更加专注于业务层面的开发,市场上涌现了各种各样的Web开发工具,灵活运用这些工具就能使得你的开发效率大幅提升,实现事半功倍。1.Web应用框架这些软件是专门设计来帮助网站开发,并使创建

    2020/03/23