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实现倒计时和文字滚动的效果实例
Oct 29 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
Aug 19 Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
Jul 26 Javascript
vue devtools的安装与使用教程
Aug 08 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 Javascript
vue3中轻松实现switch功能组件的全过程
Jan 07 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
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
2013/05/15 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
python文件比较示例分享
2014/01/10 Python
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
python实现简单猜单词游戏
2020/12/24 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
学校安全检查制度
2014/01/27 职场文书
信仰纪录片观后感
2015/06/08 职场文书
会计做账心得体会
2016/01/22 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书