每个开发人员都必须知道的8个深奥的JavaScript概念它可能会让你在整个职业生涯中受益无穷!作用域(scope) 简单地说,一个作用域就是“在你的代码中你可以访问声明的地方”。 我们有两种作用域:全局作用域和局部作用域,不同之处在于你可以在代码的任何地方访问全局作用域,但是局部作用域是在块内部声明的,所以你只能在块内部访问它们。 请注意,var关键字在变量提升部分的行为可能略有不同。{//局部作用域和正确的constaccess_inside_block='test';console.log(access_inside_block);}//错误,你不能访问这里的变量//你不在范围内console.log(access_inside_block);variablelet和const的区别 现在我们知道什么是作用域了,我们可以猜测这里最大的区别之一就是这些关键字的作用域。图1.显示的表格比较了这些关键字变量提升 你可能经常听到这个词!但这到底是什么?简而言之,变量提升是JavaScript中的一种机制,其中一些声明在执行之前先执行;就像冒泡一样,JS引擎会将它们提升到最前面,并在其他位置之前声明它们的位置,例如对于变量声明的var关键字;用var引入的变量可以在赋值之前调用,你将得到undefined的结果,或者用function关键字声明的函数可以在它在JavaScript中声明之前调用。foo();functionfoo(){//Yourfunctioncode}IIFE 这句话代表“立即调用的函数表达式”,意思是声明一个一定义就运行的函数,允许变量和函数私有化,保证循环中的异步代码正确执行。(功能(){//...})();卷曲 这是一种处理实际转换函数的JavaScript函数的高级技术,允许您在不同的步骤中将参数传递给函数并使其可在不同的步骤中调用。functioncurry(f){//curry(f)执行柯里化转换returnfunction(a){returnfunction(b){returnf(a,b);};};}//usagefunctionsum(a,b){returna+b;}letcurriedSum=curry(sum);alert(curriedSum(1)(2));//3异步 在讨论事件循环之前和webworker方面,我们应该弄清楚什么是JavaScript术语中的异步,以及当JavaScript是单线程语言时如何处理它! JavaScript是一种单线程同步编程(浏览器API)和JavaScript底层的某种机制,我们可以拥有异步JavaScript!图2 上图准确地说明了JavaScript引擎和我们从浏览器获取的WebAPI发生了什么,不妨解释一下。 JavaScript有一个简单的列表叫做“调用堆栈”(CallStack),它一个一个地管理任务(堆栈算法),但是当一个异步任务被传递时,JavaScript会把它pop到webAPI,浏览器会处理它;比如setTimeoutAPI,当异步对象的结果准备好后,浏览器会通过一些底层机制将其传回栈中。事件循环 还记得上面我告诉过你异步对象在后台完成后会在调用堆栈中返回吗?处理这种机制的部分称为“事件循环”。 事件循环会不断的检查调用栈,如果没有任务并且空闲,就会按照优先级将对象压入调用栈。图3回调和微任务队列 假设有两个异步任务在同一秒内完成,并且它们都刚刚从WebAPI返回,那么哪个会先被推送到回调? JavaScript对此有一个机制,它将回调请求分为两部分:微任务和宏任务。图4 宏任务队列在定时器超时后从setTimeout()API获取正常的回调函数。 宏任务的优先级低于用于获取事件循环回调函数的微任务队列。 微任务队列通过承诺(Promises)和变异观察者(MutationObserver)获取回调函数。 原文链接: https://javascript.plainenglish.io/javascript-deep-concepts-you-should-know-dde14aafd8d2 https://javascript.plainenglish.io/javascript-你应该知道的深层概念8965d4e409d3
