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 相关文章推荐
jquery下checked取值问题的解决方法
Aug 09 Javascript
html5+javascript制作简易画板附图
Apr 25 Javascript
javascript实现浏览器窗口传递参数的方法
Sep 03 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
javascript实现10个球随机运动、碰撞实例详解
Jul 08 Javascript
纯js代码制作的网页时钟特效【附实例】
Mar 30 Javascript
javascript鼠标滑过显示二级菜单特效
Nov 18 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 Javascript
vue通过cookie获取用户登录信息的思路详解
Oct 30 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
Mar 19 Javascript
layui表格内容溢出的解决方法
Sep 06 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 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 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python 专题一 函数的基础知识
2017/03/16 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
工程质量月活动方案
2014/02/19 职场文书
党员入党表决心的话
2014/03/11 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
七夕情人节促销方案
2014/06/07 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python