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 相关文章推荐
JS Map 和 List 的简单实现代码
Jul 08 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
Jan 13 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
jQuery+CSS实现的table表格行列转置功能示例
Jan 08 jQuery
vue 设置proxyTable参数进行代理跨域
Apr 09 Javascript
详解vantUI框架在vue项目中的应用踩坑
Dec 06 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
Vue 实例事件简单示例
Sep 19 Javascript
通过javascript实现扫雷游戏代码实例
Feb 09 Javascript
基于javascript实现碰撞检测
Mar 12 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加密函数 Javascript/Js 解密函数
2013/09/23 PHP
php除数取整示例
2014/04/24 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
jquery实现自适应banner焦点图
2017/02/16 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Python程序退出方式小结
2017/12/09 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
软件测试面试题
2015/10/21 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
销售代理协议书
2014/09/30 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
MySQL常见优化方案汇总
2022/01/18 MySQL