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脚本实现Web页面信息交互
Oct 11 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
js获取微信版本号的方法
May 12 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
JavaScript运动框架 多值运动(四)
May 18 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
vue loadmore组件上拉加载更多功能示例代码
Jul 19 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
May 14 Javascript
js图片无缝滚动插件使用详解
May 26 Javascript
js实现html滑动图片拼图验证
Jun 24 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实时显示输出
2008/10/02 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
Yii框架form表单用法实例
2014/12/04 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
学习YUI.Ext 第二天
2007/03/10 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
原生js+css调节音量滑块
2020/01/15 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
python+opencv实现高斯平滑滤波
2020/07/21 Python
Python3多线程基础知识点
2019/02/19 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python实现数字炸弹游戏程序
2020/07/17 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
党校培训思想汇报
2013/12/30 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
社区健康教育实施方案
2014/03/18 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
法学院毕业生求职信
2014/06/25 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Elasticsearch 基本查询和组合查询
2022/04/19 Python