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学习笔记(十)
Jan 17 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
jQuery(非HTML5)可编辑表格实现代码
Dec 11 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 Javascript
JavaScript 自定义事件之我见
Sep 25 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
使用vue-aplayer插件时出现的问题的解决
Mar 02 Javascript
微信小程序下拉框组件使用方法详解
Dec 28 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
PHP里的单例类写法实例
2015/06/25 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
PHP学习笔记之session
2018/05/06 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
js实现常用排序算法
2016/08/09 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
Python pass详细介绍及实例代码
2016/11/24 Python
python 反向输出字符串的方法
2018/07/16 Python
Python自动抢红包教程详解
2019/06/11 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python中的整除和取模实例
2020/06/03 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
教堂婚礼主持词
2014/03/14 职场文书
经理任命书模板
2014/06/06 职场文书
写给医院的感谢信
2015/01/22 职场文书
银行催款通知书
2015/04/17 职场文书
法制教育主题班会
2015/08/13 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js