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 相关文章推荐
prototype class详解
Sep 07 Javascript
IE8 引入跨站数据获取功能说明
Jul 22 Javascript
FormValidate 表单验证功能代码更新并提供下载
Aug 23 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
有关于JS构造函数的重载和工厂方法
Apr 07 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
Jul 15 Javascript
ExpressJS入门实例
Jan 14 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
jQuery无冲突模式详解
Jan 17 jQuery
原生JavaScript实现日历功能代码实例(无引用Jq)
Sep 23 Javascript
微信小程序 textarea 层级过高问题简单解决方案
Oct 14 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
Zerg兵种介绍
2020/03/14 星际争霸
PHP与javascript对多项选择的处理
2006/10/09 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
深入浅出php socket编程
2015/05/13 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
详解php反序列化
2020/06/10 PHP
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
python之yield表达式学习
2014/09/02 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python画图的函数用法以及技巧
2019/06/28 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
华为c/c++笔试题
2016/01/25 面试题
市三好学生主要事迹
2014/01/28 职场文书
售后服务承诺书
2014/03/26 职场文书
工程质量承诺书范文
2014/03/27 职场文书
加入学生会演讲稿
2014/04/24 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
2015年三万活动总结
2015/03/25 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书