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 相关文章推荐
点击弹出层效果&弹出窗口后网页背景变暗效果的实现代码
Feb 10 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
May 04 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
May 05 Javascript
javascript中HTMLDOM操作详解
Dec 11 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
js编写当天简单日历效果【实现代码】
May 03 Javascript
BootStrap 附加导航组件
Jul 22 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 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排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
python黑魔法之参数传递
2016/02/12 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
夜不归宿检讨书
2014/02/25 职场文书
音乐教育感言
2014/03/05 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
晚会开幕词
2015/01/28 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS