【转载】JavaScript中回调地狱的今生前世
JavaScript 由于某种原因是被设计为单线程的,同时由于 JavaScript 在设计之初是用于浏览器的 GUI 编程,这也就需要线程不能进行阻塞。所以在后续的发展过程中基本都采用异步非阻塞的编程模式。简单来说,异步编程就是在执行一个指令之后不是马上得到结果,而是继续执行后面的指令,等到特定的事件触发后,才得到结果。也正是因为这样,我们常常会说: JavaScript 是由事件驱动的。
JavaScript 由于某种原因是被设计为单线程的,同时由于 JavaScript 在设计之初是用于浏览器的 GUI 编程,这也就需要线程不能进行阻塞。所以在后续的发展过程中基本都采用异步非阻塞的编程模式。简单来说,异步编程就是在执行一个指令之后不是马上得到结果,而是继续执行后面的指令,等到特定的事件触发后,才得到结果。也正是因为这样,我们常常会说: JavaScript 是由事件驱动的。
在JavaScript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。因为函数是第一类对象,我们可以在JavaScript使用回调函数。在下面的文章中,我们将学到关于回调函数的方方面面。回调函数可能是在JavaScript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段JavaScript或者jQuery代码,但是对于许多开发者来说它任然是一个谜。在阅读本文之后你能了解怎样使用回调函数。
对于 JavaScript 的异步编程我们早就谈得太多了,我们为了处理 Callback Hell
问题已经做了太多太多了,从 Promise 到 generator
再到 async/await
,JavaScript 这个惊天巨坑算是勉强填完了。关于 Promise 、 generator
以及 aysnc/await
这些具体的技术怎么用,这里就不细谈了,我们更多谈谈 “形而上” 的东西。
JS 中最基础的异步调用方式是 callback
,它将回调函数 callback
传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback
。对于简单的异步操作,用 callback
实现,是够用的。但随着负责交互页面和 Node 出现,callback
方案的弊端开始浮现出来。 Promise 规范孕育而生,并被纳入 ES6 的规范中。后来 ES7 又在 Promise 的基础上将 async
函数纳入标准。此为 JavaScript 异步进化史。
众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着。在事件队列中加一个延时,这样的问题便可以得到缓解。
JavaScript的主要优势之一就是任何事情都是异步的。在大多数情况下,不同部分的代码不会影响共他的代码执行。
这里有一些JavaScript初学者应该知道的技巧和陷阱。 如果你已经是一个专家,那就随意阅读。
很多(JavaScript)开发者都在讨论"作用域",但它是什么?它们在JavaScript中的任何地方!我发现很多年轻的开发者不知道作用域是什么。他们中大多数人可以用jQuery做一些很酷的东西。但只是停留在从网上复制一些代码片段,修改一下他们懂的地方并且粘贴到一个JavaScript文件中的程度。了解什么是作用域和你能用它做什么是很重要的,我希望能帮你更好地理解它。我讲的大多数内容都来自我为一些年轻开发者们做了很多次的演讲。(JavaScript基础教程)
前段时间无聊或有聊地做了几个移动端的HTML5游戏。放在不同的移动端平台上进行测试后有了诡异的发现,有些手机的动画会“快”一点,有些手机的动画会“慢”一点,有些慢得还不是一两点。通过查找资料发现,基于帧的算法(Frame-based)来实现动画会导致不同帧率的平台体验不一致,而基于时间(Time-based)的动画算法可以很好地改良这种情况,让不同帧率的情况下都能达到较为统一的速度上的体验。本文介绍的就是基于帧动画算法和基于时间动画算法的差异,以及对基于时间算法的改良。
@manxisuo的《通过一张简单的图,让你彻底地、永久地搞懂JS的==
运算》一文中详细的阐述了JavaScript中的==
运算符。其实在JavaScript中还有一个另外一个运算符===
。那么这两者有何不一样呢?这篇文章就一起来看看JavaScript中==
和===
有何不同。