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使用一个按钮控制图片的伸缩实现思路
Apr 19 Javascript
JS文本框追加多个下拉框的值的简单实例
Jul 12 Javascript
jquery中animate动画积累的解决方法
Oct 05 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
js解决movebox移动问题
Mar 29 Javascript
JS闭包与延迟求值用法示例
Dec 22 Javascript
详解AngularJS 模块化
Jun 14 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
Feb 21 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
node(koa2) web应用模块介绍详解
Mar 29 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
May 12 Javascript
vant实现购物车功能
Jun 29 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 UBB 解析实现代码
2011/11/27 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
Cookie 小记
2010/04/01 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
Python之eval()函数危险性浅析
2014/07/03 Python
详解Python中的日志模块logging
2015/06/19 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Python判断telnet通不通的实例
2019/01/26 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
自主招生自荐信
2013/12/08 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书