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 相关文章推荐
双击滚屏-常用推荐
Nov 29 Javascript
jQuery使用手册之 事件处理
Mar 24 Javascript
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
Dec 10 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 Javascript
基于Node.js的WebSocket通信实现
Mar 11 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
Mar 07 Javascript
Vue性能优化的方法
Jul 30 Javascript
ES6中的Javascript解构的实现
Oct 30 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 shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
拖动时防止选中
2017/02/03 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
js精确的加减乘除实例
2017/11/14 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
Element MessageBox弹框的具体使用
2020/07/27 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Django Admin实现上传图片校验功能
2016/03/06 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
详解Python多线程下的list
2020/07/03 Python
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
个人租房协议书范本
2014/09/30 职场文书
教师师德师风整改措施
2014/10/24 职场文书
写给父母的感谢信
2015/01/22 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript