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里使用Dom操作Xml
Jan 22 Javascript
用按钮控制iframe显示的网页实现方法
Feb 04 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
Oct 29 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
微信小程序 标签传入数据
May 08 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
删除table表格行的实例讲解
Sep 21 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
vue深度监听(监听对象和数组的改变)与立即执行监听实例
Sep 04 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 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
两种php实现图片上传的方法
2016/01/22 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
python生成器的使用方法
2013/11/21 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
Delphi软件工程师试题
2013/01/29 面试题
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
化学教师教学反思
2014/01/17 职场文书
《都江堰》教学反思
2014/02/07 职场文书
高三高考决心书
2014/03/11 职场文书
综治工作汇报材料
2014/10/27 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
万能检讨书
2015/01/27 职场文书
关于五一放假的通知
2015/08/18 职场文书
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS