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编程起步(第四课)
Jan 10 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
JS组件Bootstrap导航条使用方法详解
Apr 29 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 Javascript
简单三步实现报表页面集成天气
Dec 15 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 jQuery
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
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
Sublime开发python程序的示例代码
2018/01/24 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
python sort、sort_index方法代码实例
2019/03/28 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
Java程序员综合测试题
2014/04/25 面试题
找工作最新求职信
2013/12/22 职场文书
安全生产承诺书
2014/03/26 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
2014年安全生产责任书
2014/07/22 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
Python list列表删除元素的4种方法
2021/11/01 Python