JavaScript和函数式言语的三特征

本文内容是我浏览《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这项特征只能经由过程开发人员的编程习气来保证。

    原文作者:赵俊鹏
    原文地址: https://segmentfault.com/a/1190000000424756
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞