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 在firebug调试时用console.log的方法
May 10 Javascript
window.returnValue使用方法示例介绍
Jul 03 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
Aug 22 Javascript
javascript实现完美拖拽效果
May 06 Javascript
jQuery页面弹出框实现文件上传
Feb 09 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 Javascript
Webpack打包字体font-awesome的方法示例
Apr 26 Javascript
angularJs利用$scope处理升降序的方法
Oct 08 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
vue 使用post/get 下载导出文件操作
Aug 07 Javascript
JavaScript中如何调用Java方法
Sep 16 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 array操作10个小技巧分享
2011/06/23 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
JavaScript prototype对象的属性说明
2010/03/13 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python通过ssh-powershell监控windows的方法
2015/06/02 Python
python内置数据类型之列表操作
2018/11/12 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
pytorch标签转onehot形式实例
2020/01/02 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
综合办公室个人的自我评价
2013/12/22 职场文书
2014年财务部工作总结
2014/11/11 职场文书
圣诞节开幕词
2015/01/29 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
Python Pandas 删除列操作
2022/03/16 Python
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android