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 相关文章推荐
学习ExtJS accordion布局
Oct 08 Javascript
jQuery基础知识filter()和find()实例说明
Jul 06 Javascript
使用js获取地址栏中传递的值
Jul 02 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
Aug 01 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
Jun 05 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
Feb 12 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
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
wxPython 入门教程
2008/10/07 Python
python中的多重继承实例讲解
2014/09/28 Python
Python去除列表中重复元素的方法
2015/03/20 Python
解决Python requests 报错方法集锦
2017/03/19 Python
python实现二叉查找树实例代码
2018/02/08 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
日本无添加化妆品:HABA
2016/08/18 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
北京奥运会主题口号
2014/06/13 职场文书
关于安全的广播稿
2014/10/23 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
管辖权异议上诉状
2015/05/23 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL