JS和函数式语言的三特性


Posted in Javascript onMarch 05, 2014

首先要有一个概念:并不是一个语言支持函数,这个语言就可以叫做“函数式语言”。函数式语言中的函数(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这项特性只能通过开发人员的编程习惯来保证。

Javascript 相关文章推荐
用JavaScript 处理 URL 的两个函数代码
Aug 13 Javascript
js取得url地址参数实例
Feb 22 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
Oct 24 Javascript
JavaScript中document对象使用详解
Jan 06 Javascript
javascript面向对象之定义成员方法实例分析
Jan 13 Javascript
javascript事件处理模型实例说明
May 31 Javascript
javascript cookie基础应用之记录用户名的方法
Sep 20 Javascript
jquery点击展示与隐藏更多内容
Dec 03 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
Dec 27 Javascript
JavaScript数据结构学习之数组、栈与队列
May 02 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
jquery 使用简明教程
Mar 05 #Javascript
jquery form表单序列化为对象的示例代码
Mar 05 #Javascript
js对文章内容进行分页示例代码
Mar 05 #Javascript
JavaScript获取XML数据附示例截图
Mar 05 #Javascript
js通过八个点 拖动改变div大小的实现方法
Mar 05 #Javascript
javascript日期格式化示例分享
Mar 05 #Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 #Javascript
You might like
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
JavaScript 无符号右移运算符
2009/04/17 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python unittest模块用法实例分析
2018/05/25 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python 堆和优先队列的使用详解
2019/03/05 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
毕业典礼演讲稿
2014/05/13 职场文书
英语教育专业自荐信
2014/05/29 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
2015年招聘工作总结
2014/12/12 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
高中班主任心得体会
2016/01/07 职场文书