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 - 如何引入js代码
Mar 09 Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
详解Python中logging日志模块在多进程环境下的使用
Dec 26 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
深入理解React中何时使用箭头函数
Aug 23 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
Node.js+ELK日志规范的实现
May 23 Javascript
vue项目中锚点定位替代方式
Nov 13 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
Aug 20 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 Javascript
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
自定义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
Terran兵种对照表
2020/03/14 星际争霸
php后门URL的防范
2013/11/12 PHP
PHP7多线程搭建教程
2017/04/21 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
JS实现购物车特效
2017/02/02 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
python的几种开发工具介绍
2007/03/07 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python实现ID3决策树算法
2017/12/20 Python
python实现京东秒杀功能
2018/07/30 Python
Python-接口开发入门解析
2019/08/01 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python代码xml转txt实例
2020/03/10 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
小学语文课后反思精选
2014/04/25 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python