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玩一玩WSH吧
Feb 23 Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
JS实现切换标签页效果实例代码
Nov 01 Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 Javascript
Bootstrap每天必学之级联下拉菜单
Mar 27 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
js基础之DOM中元素对象的属性方法详解
Oct 28 Javascript
基于jquery实现的鼠标悬停提示案例
Dec 11 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
Nov 08 Javascript
浅谈React中组件间抽象
Jan 27 Javascript
详解VUE项目中安装和使用vant组件
Apr 28 Javascript
jQuery实现轮播图源码
Oct 23 jQuery
自定义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分页函数
2006/07/08 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
angular.bind使用心得
2015/10/26 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
layerUI下的绑定事件实例代码
2018/08/17 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
Python的print用法示例
2014/02/11 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
你真的了解Python的random模块吗?
2017/12/12 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
python实现五子棋小程序
2019/06/18 Python
python读写csv文件实例代码
2019/07/05 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
教师辞职报告范文
2014/01/20 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS