King Mui

用艺术的眼光发现技术的美

函数式编程风格起源于 20 世纪 30 年代 lambda 演算的发明。函数自 17 世纪诞生以来,一直是作为微积分的一部分而存在的。函数可以作为函数的参数传递,还可以作为函数的执行结果被返回。更复杂的函数被称为高阶函数,它可以精确的控制函数,既可以将函数当作参数传递,也可以将函数作为执行结果返回,或者二者兼而有之。在 20 世纪 30 年代,Alonzo Church 在普林斯顿大学用高阶函数做实验时发明了 lambda 演算。

20 世纪 50 年代初,John McCarthy 借鉴了 lambda 演算的概念,并将它应用到一门新的名为 Lisp 的编程语言上。Lisp 实现了高阶函数的概念,并将函数作为第一类成员或者第一类公民。一个函数被当作第一类成员时,它不仅可以被声明为一个变量,而且可以被当作函数参数传递。这些函数甚至可以作为函数的执行结果被返回。

什么是函数式编程

JavaScript 可以进行函数式编程,因为 JavaScript 中的函数就是第一类公民。这意味着变量可以做的事情函数同样也可以。ES6 标准中还添加了不少语言特性,可以帮助我们更充分地使用函数式编程技术,其中包括箭头函数、Promise 对象和扩展运算符等。

阅读全文 »

ECMAScript 5 引入了 strict mode,现在已经被大多浏览器实现(包括 IE10)。会使 web 浏览器更容易的解析代码(只需要添加 "use strict"; 在源码的最上面)。

严格模式不仅仅是一个子集:它的产生是为了形成与正常代码不同的语义。不支持严格模式与支持严格模式的浏览器在执行严格模式代码时会采用不同行为。所以在没有对运行环境展开特性测试来验证对于严格模式相关方面支持的情况下,就算采用了严格模式也不一定会取得预期效果。严格模式代码和非严格模式代码可以共存,因此项目脚本可以渐进式地采用严格模式。

严格模式对正常的 JavaScript 语义做了一些更改。

  1. 严格模式通过抛出错误来消除了一些原有静默错误
  2. 严格模式修复了一些导致 JavaScript 引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快
  3. 严格模式禁用了在 ECMAScript 的未来版本中可能会定义的一些语法。

非严格模式到严格模式的区别

严格模式同时改变了语法及运行时行为。

阅读全文 »

不是要和你玩捉迷藏

大朵的云可以作证

这黄金的花园里

一条光影斑驳的小路伸向了远方

阅读全文 »

在过去很长的时间里,JavaScript 开发人员在处理异步代码时不得不依赖回调函数来解决。结果,我们中的很多人都经历过回调地域。

然后我们迎来了 Promise。他们为回调提供了更有组织的替代方案,并且大多数社区很快也都转而使用它们。

现在,随着最新添加的 Async / Await,我们终于可以编写更高质量的 JavaScript 代码!

什么是 Async/Await?

Async / Await 是一个备受期待的 JavaScript 功能,它使异步函数的使用更加愉快和易于理解。它构建在 Promise 之上,并与所有现有的基于 Promise 的 API 兼容。

Async - 定义异步函数

1
async function someName(){...}
  • 自动把函数转换为 Promise
  • 当调用异步函数时,函数返回值会被 resolve 处理
  • 异步函数内部可以使用 await
阅读全文 »

Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值。

1
new Promise( function(resolve, reject) {...} /* executor */  );

Promise 构造函数执行时立即调用“处理器函数”(executor function), resolvereject 两个函数作为参数传递给“处理器函数”。“处理器函数”内部通常会执行一些异步操作,一旦异步操作执行完毕(可能成功/失败),要么调用 resolve 函数来将 promise 状态改成 fulfilled,要么调用 reject 函数将 promise 的状态改为 rejected。如果在“处理器函数”中抛出一个错误,那么该 promise 状态为 rejected

一个 Promise 有以下几种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。
  • settled: 处在 fulfilledrejected 状态而不是 pending 状态。

因为 Promise.prototype.thenPromise.prototype.catch 方法返回 promise 对象, 所以它们可以被链式调用

阅读全文 »