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与C# Windows应用程序交互方法
Jun 29 Javascript
让你的CSS像Jquery一样做筛选的实现方法
Jul 10 Javascript
JQuery each()嵌套使用小结
Apr 18 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
详解Bootstrap各式各样的按钮(推荐)
Dec 13 Javascript
快速入门Vue
Dec 19 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
JS自动生成动态HTML验证码页面
Jun 14 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
Apr 09 Javascript
Element Notification通知的实现示例
Jul 27 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 移除数组重复元素的一点说明
2008/11/27 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python关闭windows进程的方法
2015/04/18 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
django初始化数据库的实例
2018/05/27 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python求质数的3种方法
2018/09/28 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
如何用python 操作zookeeper
2020/12/28 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
学生发电厂实习自我鉴定
2013/09/22 职场文书
赔偿协议书范本
2014/04/15 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
医德医魂心得体会
2014/09/11 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Ajax实现异步加载数据
2021/11/17 Javascript