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 相关文章推荐
写的htc的数据表格
Jan 20 Javascript
pjblog中的UBBCode.js
Apr 25 Javascript
动态添加option及createElement使用示例
Jan 26 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 Javascript
代码整洁之道(重构)
Oct 25 Javascript
微信小程序左滑删除功能开发案例详解
Nov 12 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 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实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
json跟xml的对比分析
2008/06/10 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
Prototype Date对象 学习
2009/07/12 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
React实现轮播效果
2020/08/25 Javascript
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
学习python可以干什么
2019/02/26 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
Python之Sklearn使用入门教程
2021/02/19 Python
广州盈通面试题
2015/12/05 面试题
体育教师自我鉴定
2014/02/12 职场文书
男女朋友协议书
2014/04/23 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
幼儿园辞职信
2015/05/13 职场文书
英语导游欢迎词
2015/09/30 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL