JS和函数式语言的三特性

       本文内容是我阅读《JavaScript语言精髓与编程实践》时,做的读书笔记,周爱民老师的书写的太深刻了

  首先要有一个概念:并不是一个语言支持函数,这个语言就可以叫做“函数式语言”。函数式语言中的函数(function),除了能被调用之外,还具有一些其他性质。有以下三点:

  1. 函数是运算元

  2. 在函数内保存数据

  3. 函数内的运算对函数外无副作用

  一、函数是运算元

  普通的函数调用时,可以抽象的理解为:函数就是一个运算符,传入的参数是运算元;

  但当JavaScript中的函数作为另一个函数的参数使用时,是传递引用的,这个“传入参数”就可以被理解为是一个运算元。由此的结论是,(作为“传入参数”的)函数具有运算元的含义,“函数参数”与普通参数并没有什么不同。

  二、在函数内保存数据

  在命令式语言中,函数内部的私有变量(局部变量)是不能被保存的。从程序的执行方式上来讲,局部变量在栈上分配,在函数执行结束后,所占用的栈被释放。因此函数内的数据不可能被保存。

  在JavaScript的函数中,函数内的私有变量可以被修改,而且当再次“进入”到该函数内部时,这个被修改的状态仍将持续。下面的例子说明了这个特性:

代码如下:
  var set,get;
  function MyFunc(){
      var value = 100;
 
      function set_value(v){
          value = v;
      }
      function get_value(){
          return value;
      }
 
      set = set_value;
      get = get_value;
  }  
  MyFunc();
  console.log(get()); //100
  set(300);
  console.log(get()); //300
 

  显而易见的一个好处是,如果一个数据能够在函数内持续保存,那么该函数(作为构造器)赋给实例时就可以使用这些数据进行运算;而在多个实例之间,由于数据存在于不同的闭包中,由此相互不会产生影响。

  以面向对象的术语来解释,就是说不同的实例有各自的私有数据(复制自某个公共的数据)。下面的例子说明了这个特性:

 代码如下:
  function MyObject(){
      var value = 100;
      this.setValue = function(){
          value = v;
      }
      this.showValue = function(){
          console.log(value);
      }
  }
  var obj1 = new MyObject();
  var obj2 = new MyObject();
 
  obj2.setValue(300);
  obj1.showValue(); //100;
 

  三、函数内的运算对函数外无副作用

  这一特性的含义在于:

  * 函数使用入口参数进行运算,而不修改它(作为值参数而不是变量参数使用)

  * 在运算过程中不会修改函数外部的其他数据的值(例如全局变量)

  * 运算结束后通过“函数返回”向外部系统传值

  这样的函数在运算过程中对外部系统是无副作用的。然而我们注意到,JavaScript允许在函数内部引用和修改全局变量,甚至可以声明全局变量。这一点其实是破坏它的函数式特性的。

  除此之外,JavaScript也允许在函数内修改对象和数组成员————这些成员应该由对象方法而非对象系统外的其他函数来修改。

  所以:JavaScript这项特性只能通过开发人员的编程习惯来保证。

 
 

时间: 2024-12-31 17:55:22

JS和函数式语言的三特性的相关文章

JS和函数式语言的三特性_基础知识

首先要有一个概念:并不是一个语言支持函数,这个语言就可以叫做"函数式语言".函数式语言中的函数(function),除了能被调用之外,还具有一些其他性质.有以下三点:1. 函数是运算元2. 在函数内保存数据3. 函数内的运算对函数外无副作用一.函数是运算元普通的函数调用时,可以抽象的理解为:函数就是一个运算符,传入的参数是运算元:但当JavaScript中的函数作为另一个函数的参数使用时,是传递引用的,这个"传入参数"就可以被理解为是一个运算元.由此的结论是,(作为

结合实例实习F#(三)--理解函数式语言中的函数

前两篇我主要说了些F#中基本的语法,今天我接着来说说函数,函数在函数式编程中起着非常重要的作用,可以夸张一点来说,如果你了解并能熟练应用函数,你就可以向别人说"我精通函数式编程了". 经常有人觉得F#难懂难用,我觉得一部分原因是F#中的函数接口(这里的接口指的是function signature, 我习惯叫它函数接口,如果对您阅读带来什么不便,请见谅). 看起来和我们平常熟悉的很不一样(比如C#),导致一些朋友在尝鲜阶段遇到困难,进而觉得其难懂难用,最后彻底将F#打入冷宫.希望下面的

JS将数字转换成三位逗号分隔的样式

 本篇文章主要是对JS将数字转换成三位逗号分隔的样式(示例代码)进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助  代码如下: function   formatNum(num) {        if(!/^(+|-)?(d+)(.d+)?$/.test(num)){alert("wrong!");   return   num;}        var   a   =   RegExp.$1,   b   =   RegExp.$2,   c   =   RegExp.$3

js实现图片旋转的三种方法

 这篇文章主要介绍了js实现图片旋转的三种方法,需要的朋友可以参考下 1 使用jQueryRotate.js实现    示例代码:  代码如下: <!DOCTYPE html>  <html>  <head>  <title></title>  <style type="text/css">  #div1 {  width: 800px;  height: 600px;  background-color: #ff

急急急-用c语言写三个函数分别判断年月日是否合法

问题描述 用c语言写三个函数分别判断年月日是否合法 年规定在1900-2050,月规定1-12,还要考虑是否闰年,闰年二月的天数是否正确,不正确则重新输入.本人实习生,整不出来领导要发飙了,这是一个通讯录内容的一部分,输入用户生日,1.name. 2.address. 3.birthyear. 4.birthmonth. 5.birthday 解决方案 #include<stdio.h> int isYear(int y) { return y>=1900 && y<

JS触发方法事件,三个下拉框,其中任意两个有值,第三个改变时触发,

问题描述 JS触发方法事件,三个下拉框,其中任意两个有值,第三个改变时触发, JS触发方法事件,三个下拉框,其中任意两个有值,第三个改变时触发, 解决方案 3个select的事件都判断下是否都有值了,有了就执行相关代码 if(sel1.value!=''&&sel2.value!=''&&sel3.value!=''){ //..... } 解决方案二: JS改变input的value值不触发onchange事件解决方案 解决方案三: 你这是什么意思?任意两个有值?第三个改

Swift语言指南(三)--语言基础之整数和浮点数

原文:Swift语言指南(三)--语言基础之整数和浮点数   整数   整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头.   整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值:

C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)

原文:C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA发布的最新规范,C# 6.0还是草案阶段,C# 7.1是微软当前提供的最新规范. 这里仅仅列个提纲,由于C# 5.0是具有ECMA标准规范的版本,所以选择C# 5.0作为主要版本学习,并专题学习C# 6.0,7.0版本新特性. C

Lisp 家族迎来新成员,函数式语言 Lux 是什么?

代码世界即将加入一门新成员:Lux.你没看错,它不是洗发水,而是古老的 Lisp 家族中新诞生的函数式语言. 目前 Lux 还在研发之中,最新版本是 0.5.0.它可被用来编写一系列在 JVM (Java 虚拟机)上运行的程序.但它的语义并不是与 JVM 绑定的,因此,Lux 应该被理解为是一门通用语言,被设计用来尽可能多平台地进行程序表示.但同时,它要能够深入每一个特定平台,实现后者的丰富功能.     作为新语言,它有何特别之处? Lux 是纯粹的函数式编程语言,它采用了严格计算(eager