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 valueOf 使用方法
Dec 28 Javascript
js trim函数 去空格函数与正则集锦
Nov 20 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
javascript实现列表切换效果
May 02 Javascript
限制复选框最多选择项的实现代码
May 30 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
Jun 21 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
简单的用PHP编写的导航条程序
2006/10/09 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
ext jquery 简单比较
2010/04/07 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
python 合并文件的具体实例
2013/08/08 Python
Python中str.join()简单用法示例
2018/03/20 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python获取txt文件词向量过程详解
2019/07/05 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Django实现基于类的分页功能
2019/10/31 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
四年级科学教学反思
2014/02/10 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
论文指导教师评语
2014/04/28 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
伦敦奥运会口号
2014/06/13 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python