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,jquery闭包概念分析
Jun 19 Javascript
各情景下元素宽高的获取实现代码
Sep 13 Javascript
jQuery $.get 的妙用 访问本地文本文件
Jul 12 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
jQuery绑定事件on()与弹窗的简要概述
Apr 27 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
Aug 23 Javascript
PHP7新特性简述
Jun 11 Javascript
VueJs使用Amaze ui调整列表和内容页面
Nov 30 Javascript
微信小程序功能之全屏滚动效果的实现代码
Nov 22 Javascript
详解vue 组件
Jun 11 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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数组交集的优化代码分析
2011/03/06 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
node-red File读取好保存实例讲解
2019/09/11 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
django 消息框架 message使用详解
2019/07/22 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
英国鞋网:Rubber Sole
2020/03/03 全球购物
结构工程研究生求职信
2013/10/13 职场文书
聚美优品励志广告词
2014/03/14 职场文书
经济担保书范文
2014/04/02 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
同学会邀请函模板
2015/01/30 职场文书
企业百日安全活动总结
2015/05/07 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang