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 相关文章推荐
Mozilla 表达式 __noSuchMethod__
Apr 05 Javascript
jquery获得下拉框值的代码
Aug 13 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
Dec 02 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
Aug 23 Javascript
基于jQuery实现下拉框
Nov 24 Javascript
使用jquery 简单实现下拉菜单
Jan 14 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
Nuxt.js开启SSR渲染的教程详解
Nov 30 Javascript
JavaScript Html实现移动端红包雨功能页面
Jan 10 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的类 功能齐全的发送邮件类
2006/10/09 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php获取字段名示例分享
2014/03/03 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
留学自荐信写作方法
2014/01/27 职场文书
公司新年寄语
2014/04/04 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库
hive数据仓库新增字段方法
2022/06/25 数据库