函数式 JavaScript(一)简介

 更新时间:2014年07月07日 11:40:53   投稿:hebedich  
JavaScript 是一种强大但被误解的语言。关于它到底是一种面向对象的语言还是函数式语言,人们众说纷纭——但是现在让我们把这些争辩都抛到脑后。

让我们假装现在要完成一个任务:尽可能按照函数式语言的原则来写JavaScript代码。

接下来一系列文章就是为了让你们和我一起开始这样一段旅程。首先,我们需要纠正一些你们脑子中可能有的对函数式语言错误的概念。

JS语言中的函数式被严重误解。

很显然,有相当多的开发者要每天用JavaScript的函数式范式 。我想说有更大一部分JavaScript 开发者没有真正理解这些东西。

我认为造成这个的原因是绝大多数用于Web服务器端的开发语言都是来源于C,而大家都知道这些语言不是函数式语言。

一般有两个层面的困惑。第一层是关于以下示例中的用法,这是jQuery中非常常见的用法:

$(".signup").click(function(event){
    $("#signupModal").show();
    event.preventDefault();
});

在上面这段代码中:我们传了一个匿名函数作为参数,这就是在JavaScript 中臭名昭著的回调函数。这些函数会被调用吗?根本不会!

上面这个例子说明了函数式语言的一个关键特征:函数是一种参数。另一方面,这个例子只用三行代码违反了几乎所有能违反的函数式编程范式。

第二层的疑惑是更微妙的。看看这个:只有少数时髦的JS开发者是这样看自己的:

嗯,真不错!但是我已经完全了解函数式编程,我在所有的项目中都用了Underscore.js。

Underscore.js是一个非常著名并且随处可见的JavaScript 库。举个例子:假设我有一组词,并且我需要每个词对应的前两个字母。这用Underscore.js来写非常简单:

var firstTwoLetters = function(words){
    return _.map(words,function(word){
        return _.first(word,2);
    });
};

看这个JavaScript 例子。我用了函数式中精致又实用的函数:_.map和_.first。对于这个大家有什么想法?

虽然underscore.js和 _.map这样的函数都是很有用的函数式范式,但是像这个例子中这样把这些东西放在一起还是让我感到有些难以理解。我们真的需要这样做吗?

如果我们开始思考怎样才能更加“函数式”,也许我们可以把上面的例子改写成这样:

// ...a little bit of magic
var firstTwoLetters = map(first(2));

仔细想想,这一行代码和上面的5行是一样的效果。很多词只是参数或占位符。真正的逻辑在于把map函数、first函数和常量2用有意义的方式组合在一起。

有些人可能在想:这个例子中的神奇之处在哪里?毕竟,说任何一个例子神奇都有点像吹嘘,对吧?

我正打算用接下来的两篇文章来解释上面这个例子到底神奇在哪,如果你好奇的话,可以继续往下看。

这一系列博客是为了帮助大家怎样把函数式编程的美妙之处应用到你的JavaScript代码中。

下一节中,我将讨论JavaScript 语言中函数式及非函数式的多种元素。有了这些知识,我们可以通过把这些元素整合在一起,慢慢的在脑中形成函数式编程的完整体系,并且理解它们在JavaScript中的表现。

相关文章

  • 微信小程序实现登录页云层漂浮的动画效果

    微信小程序实现登录页云层漂浮的动画效果

    微信小程序目前的火热程度相信不用多言,最近利用空余时间用小程序实现了个动态的登录页效果,所以下面这篇文章主要给大家介绍了利用微信小程序实现登录页云层漂浮动画效果的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • 解决layui中的form表单与button的点击事件冲突问题

    解决layui中的form表单与button的点击事件冲突问题

    今天小编就为大家分享一篇解决layui中的form表单与button的点击事件冲突问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 使用Vue3实现一个Upload组件的示例代码

    使用Vue3实现一个Upload组件的示例代码

    这篇文章主要介绍了使用Vue3实现一个Upload组件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • JS作用域链详解

    JS作用域链详解

    这篇文章主要为大家详细介绍了JS作用域链的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • js实现常见的工具条效果

    js实现常见的工具条效果

    本文主要介绍了js实现常见的工具条效果的实例。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • LayUI switch 开关监听 获取属性值、更改状态的方法

    LayUI switch 开关监听 获取属性值、更改状态的方法

    今天小编就为大家分享一篇LayUI switch 开关监听 获取属性值、更改状态的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 通过网页查看JS源码中汉字显示乱码的解决方法

    通过网页查看JS源码中汉字显示乱码的解决方法

    这篇文章给大家主要介绍了通过网页查看JS源码的时候,发现汉字显示是乱码的解决方法,文中通过图文详解的介绍了解决的步骤,详细会对大家很有帮助,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • javascript格式化日期时间方法汇总

    javascript格式化日期时间方法汇总

    本文给大家汇总介绍了javascript格式化日期时间的五种常用方法,个人对第五种个性化输出时间比较有兴趣,基本上只要项目中能用到都是使用第五种,推荐给小伙伴们。
    2015-06-06
  • JavaScript实现数组在指定位置插入若干元素的方法

    JavaScript实现数组在指定位置插入若干元素的方法

    这篇文章主要介绍了JavaScript实现数组在指定位置插入若干元素的方法,涉及javascript中splice方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • JavaScript canvas实现跟随鼠标移动小球

    JavaScript canvas实现跟随鼠标移动小球

    这篇文章主要为大家详细介绍了JavaScript canvas实现跟随鼠标移动小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02

最新评论