JavaScript匿名函数之模仿块级作用域


Posted in Javascript onDecember 12, 2015

匿名函数

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。

匿名函数:就是没有函数名的函数。

函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式

第一种:这也是最常规的一种

function double(x){
  return 2 * x;  
}

 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。

var double = new Function('x', 'return 2 * x;');

 第三种:

var double = function(x) { return 2* x; }

 注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量square。

JavaScript中是没有块级作用域概念的。也就是说,在块级语句中定义的变量,实际上是在包含函数中(外部函数)而非语句中创建的。

function outputNumber(count){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  } 
  alert(i);  //count 
}

该函数在java、C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁了。但在JavaScript中,变量i是定义在outputNumber()活动对象中的,因此在它定义开始,就可以在函数内部访问它。即使重新声明同一个变量,也不会改变它的值。

function outputNumber(count){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  } 
  var i;   //重新声明变量 
  alert(i);  //count 
}

匿名函数可以用来模仿块级作用域并避免这个问题,用作块级作用域(也称私有作用域)的匿名函数的语法如下:

(function(){ 
   //这是块级作用域 
})()

以上代码定义变调用了一个匿名函数,将函数声明包含在一个小括号里面,表示它是个函数表达式。紧跟其后的另一对小括号会立即调用这个函数。
无论什么时候,只要临时需要一些变量,就可以用私用作用域,例如:

function outputNumber(count){ 
  (function(){ 
  for(var i=0;i<1000;i++){ 
    alert(i); 
  })(); 
  alert(i);  //导致一个错误 
}

这样,我们在for循环外部插入了一个私有作用域。在匿名函数中定义的任何变量,都会在执行结束时被销毁。

这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。

一般来说,我们应该尽量减少向全局作用域中添加变量和函数。

这种做法可以减少闭包占用内存的问题,因为没有指向匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域链。

Javascript 相关文章推荐
javascript 显示当前系统时间代码
Dec 28 Javascript
jQuery EasyUI NumberBox(数字框)的用法
Jul 08 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
分享一款基于jQuery的视频播放插件
Oct 09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
node.js中fs.stat与fs.fstat的区别详解
Jun 01 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
JavaScript设计模式之构造函数模式实例教程
Jul 02 Javascript
解决layer.confirm快速点击会重复触发事件的问题
Sep 23 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
Dec 12 #Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
Dec 11 #Javascript
jQuery入门之层次选择器实例简析
Dec 11 #Javascript
jQuery使用$.ajax提交表单完整实例
Dec 11 #Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 #Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 #Javascript
jQuery弹簧插件编写基础之“又见弹窗”
Dec 11 #Javascript
You might like
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
关于php中一些字符串总结
2016/05/05 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
社会实践自我鉴定
2013/11/07 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
高二英语教学反思
2014/01/19 职场文书
环境工程专业自荐信
2014/03/03 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年教师新年寄语
2014/12/08 职场文书
2015年领班工作总结
2015/04/29 职场文书
纪委立案决定书
2015/06/24 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
js不常见操作运算符总结
2021/11/20 Javascript
mysql数据库如何转移到oracle
2022/12/24 MySQL