JavaScript function函数种类详解


Posted in Javascript onFebruary 22, 2016

本篇主要介绍普通函数、匿名函数、闭包函数

目录

  • 普通函数:介绍普通函数的特性:同名覆盖、arguments对象、默认返回值等。
  • 匿名函数:介绍匿名函数的特性:变量匿名函数、无名称匿名函数。
  • 闭包函数:介绍闭包函数的特性。

 

1. 普通函数
1.1 示例

function ShowName(name) {
  alert(name);
}

1.2 Js中同名函数的覆盖

在Js中函数是没有重载,定义相同函数名、不同参数签名的函数,后面的函数会覆盖前面的函数。调用时,只会调用后面的函数。

var n1 = 1;
 
function add(value1) {
  return n1 + 1;
}
alert(add(n1));//调用的是下面的函数,输出:3
 
function add(value1, value2) {
  return value1 + 2;
}
alert(add(n1));//输出:3

1.3 arguments对象

arguments 类似于C#的params,操作可变参数:传入函数的参数数量大于定义时的参数数量。

function showNames(name) {
  alert(name);//张三
  for (var i = 0; i < arguments.length; i++) {
    alert(arguments[i]);//张三、李四、王五
  }
}
showNames('张三','李四','王五');

1.4 函数的默认返回值

若函数没有指明返回值,默认返回的是'undefined'

function showMsg() {
}
alert(showMsg());//输出:undefined

2.匿名函数
2.1 变量匿名函数

2.1.1 说明
可以把函数赋值给变量、事件。

2.1.2 示例

//变量匿名函数,左侧可以为变量、事件等
var anonymousNormal = function (p1, p2) {
  alert(p1+p2);
}
anonymousNormal(3,6);//输出9

2.1.3 适用场景
①避免函数名污染。若先声明个带名称的函数,再赋值给变量或事件,就造成了函数名的滥用。

2.2 无名称匿名函数

2.2.1 说明
即在函数声明时,在后面紧跟参数。Js语法解析此函数时,里面代码立即执行。

2.2.2 示例

(function (p1) {
  alert(p1);
})(1);

2.2.3 适用场景
①只需执行一次的。如浏览器加载完,只需要执行一次且后面不执行的功能。

3. 闭包函数
3.1 说明

 假设,函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数。

3.2 示例

3.2.1 示例1:全局引用与局部引用

function funA() {
  var i = 0;
  function funB() { //闭包函数funB
    i++;
    alert(i)
  }
  return funB;
}
var allShowA = funA(); //全局变量引用:累加输出1,2,3,4等
 
function partShowA() {
  var showa = funA();//局部变量引用:只输出1
  showa();
}

allShowA是个全局变量,引用了函数funA。重复运行allShowA(),会输出1,2,3,4等累加的值。

执行函数partShowA(),因为内部只声明了局部变量showa来引用funA,执行完毕后因作用域的关系,释放showa占用的资源。

闭包的关键就在于作用域:全局变量占有的资源只有当页面变换或浏览器关闭后才会释放。var allShowA = funA() 时,相当于allShowA引用了funB(),从而使funB()里的资源不被GC回收,因此funA()里的资源也不会。 

3.2.2 示例2:有参闭包函数

function funA(arg1,arg2) {
  var i = 0;
  function funB(step) {
    i = i + step;
    alert(i)
  }
  return funB;
}
var allShowA = funA(2, 3); //调用的是funA arg1=2,arg2=3
allShowA(1);//调用的是funB step=1,输出 1
allShowA(3);//调用的是funB setp=3,输出 4

3.2.3 示例3:父函数funA内的变量共享

function funA() {
  var i = 0;
  function funB() {
    i++;
    alert(i)
  }
  allShowC = function () {// allShowC引用匿名函数,与funB共享变量i
    i++;
    alert(i)
  }
  return funB;
}
var allShowA = funA();
var allShowB = funA();//allShowB引用了funA,allShowC在内部重新进行了绑定,与allShowB共享变量i

3.3 适用场景

①保证函数funA内里的变量安全,因为外部不能直接访问funA的变量。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
Jun 09 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
Jun 14 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
Jun 14 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
jQuery中slice()方法用法实例
Jan 07 Javascript
js图片模糊切换显示特效的方法
Feb 17 Javascript
jQuery编写网页版2048小游戏
Jan 06 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
基于JavaScript中标识符的命名规则介绍
Jan 06 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
javascript 易错知识点实例小结
Apr 25 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
Feb 22 #Javascript
jQuery获取字符串中出现最多的数
Feb 22 #Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 #Javascript
简单谈谈javascript中this的隐式绑定
Feb 22 #Javascript
javascript实现一个简单的弹出窗
Feb 22 #Javascript
Js的Array数组对象详解
Feb 22 #Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 #Javascript
You might like
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php实现的二分查找算法示例
2017/06/20 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
vue中appear的用法
2017/08/17 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
公司廉洁自律承诺书
2014/03/27 职场文书
离婚财产处理协议书
2014/09/30 职场文书
幼师自荐信范文
2015/03/06 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
花木兰观后感
2015/06/10 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis