Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

从几个关键词来理解函数式编程 #37

Open
TokenYangForever opened this issue Apr 9, 2018 · 0 comments
Open

从几个关键词来理解函数式编程 #37

TokenYangForever opened this issue Apr 9, 2018 · 0 comments

Comments

@TokenYangForever
Copy link
Owner

TokenYangForever commented Apr 9, 2018

一等公民

  • 经常看到的一句话就是:“函数是一等公民”。这个一等公民怎么理解呢,可能这句话在不同编程语言里也有差异。在JavaScript中,变量类型分两种:原生类型和对象类型。函数自然是对象类型,一等公民可以理解成first-class object(第一类对象)
  • 函数既然是对象,那么就可以做到以下功能:
    • 可以将函数作为参数传入另一个函数,也可以被当作返回值返回
    • 函数可以包含自己的属性和方法
    • 可以将函数赋值给变量,可以在代码运行时动态创建
  • 我个人是这样理解的:对象(object)能做到的事情,函数也都能做,而JavaScript作为一门面向对象语言,对象(object)的权力自然是很大的,可以把Object看做是JavaScript中的一等公民,函数自然也是一等公民了。

纯函数

  • 纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。
  • 举个例子:数组的slicesplice方法,他们作用很相似,slice符合纯函数的定义,因为它不会改变原数组的值,输入相同的参数,一定会得到相同的返回值。而splice在调用时就永久的改变了原数组的值(产生副作用了!)。
var xs = [1,2,3,4,5];
// 纯的
xs.slice(0,3);
//=> [1,2,3]

xs.slice(0,3);
//=> [1,2,3]

xs.slice(0,3);
//=> [1,2,3]

// 不纯的
xs.splice(0,3);
//=> [1,2,3]

xs.splice(0,3);
//=> [4,5]

xs.splice(0,3);
//=> []
  • 纯函数的还有一个特点,就是自给自足,不依赖于外部环境,也就是不会去引用其他作用域的变量,只会使用传入的参数以及内部作用域的变量。下面再来看一个例子,假如我们要定义一个函数,用来判断是否成年了(age大于18):
// 不纯的,引用了外部变量
let adultAge = 21;
const checkAge = function(age) {
  return age >= adultAge;
};
// 纯的
const checkAge = function(age) {
  let adultAge = 21;
  return age >= adultAge;
};
  • 所以推荐使用纯函数来避免产生副作用,副作用的定义为:在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。

柯里化

  • 概念:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant