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 相关文章推荐
jquery实现的一个导航滚动效果具体代码
May 27 Javascript
使用jQuery避免鼠标双击的解决方案
Aug 21 Javascript
jQuery操作input值的各种方法总结
Nov 21 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
Jun 16 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
ES6中箭头函数的定义与调用方式详解
Jun 02 Javascript
Vue通过ref父子组件拿值方法
Sep 12 Javascript
对angularjs框架下controller间的传值方法详解
Oct 08 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 Javascript
搭建vscode+vue环境的详细教程
Aug 31 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
怎样在php中使用PDF文档功能
2006/10/09 PHP
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JS生成随机字符串的多种方法
2014/06/10 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
python解析xml模块封装代码
2014/02/07 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python类的继承和多态代码详解
2017/12/27 Python
Python pip 常用命令汇总
2020/10/19 Python
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
房地产销售大学生自我评价分享
2013/11/11 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
小学生安全责任书
2014/07/25 职场文书
单位委托书怎么写
2014/08/02 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
自我检讨报告
2015/01/28 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
JavaScript执行机制详细介绍
2021/12/06 Javascript