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 相关文章推荐
FF IE兼容性的修改小结
Sep 02 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
Feb 02 Javascript
常用的几段javascript代码分享
Mar 25 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
微信小程序引用公共js里的方法的实例详解
Aug 17 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
使用JS模拟锚点跳转的实例
Feb 01 Javascript
vuex 的简单使用
Mar 22 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHPAnalysis中文分词类详解
2014/06/13 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python提取字典key列表的方法
2015/07/11 Python
详解numpy的argmax的具体使用
2019/05/27 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python中如何使用insert函数
2020/01/09 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
深入了解NumPy 高级索引
2020/07/24 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
篮球比赛策划方案
2014/06/05 职场文书
党员评议思想汇报
2014/10/08 职场文书
职代会闭幕词
2015/01/28 职场文书
客房领班岗位职责
2015/02/11 职场文书
考博导师推荐信范文
2015/03/27 职场文书
面试复试通知单
2015/04/24 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python