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 相关文章推荐
TimergliderJS 一个基于jQuery的时间轴插件
Dec 07 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
cookie的secure属性详解
Apr 08 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
Dec 26 Javascript
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
Vue中computed和watch有哪些区别
Dec 19 Vue.js
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 日期时间函数的高级应用技巧
2009/10/10 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python如何将多个PDF进行合并
2019/08/13 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python绘制高斯曲线
2021/02/19 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
研究生自荐信
2013/10/09 职场文书
大学生毕业的自我评价分享
2014/01/02 职场文书
办理退休介绍信
2014/01/09 职场文书
优秀幼教自荐信
2014/02/03 职场文书
C++程序员求职信
2014/05/07 职场文书
学生党员公开承诺书
2014/05/28 职场文书
会计求职信
2014/05/29 职场文书
葬礼主持词
2015/07/02 职场文书
排球赛新闻稿
2015/07/17 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python
「月刊Action」2022年5月号封面公开
2022/03/21 日漫