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 相关文章推荐
URI、URL和URN之间的区别与联系
Dec 20 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
jQuery登陆判断简单实现代码
Apr 21 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
详解参数传递四种形式
Jul 21 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
深入理解javascript函数参数与闭包
Dec 12 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
Aug 08 Javascript
JS工厂模式开发实践案例分析
Oct 17 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
跟老齐学Python之用while来循环
2014/10/02 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
python实现机器人行走效果
2018/01/29 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
简单实现python聊天程序
2018/04/01 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
技能比武方案
2014/05/21 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server