JavaScript使用闭包模仿块级作用域操作示例


Posted in Javascript onJanuary 21, 2019

本文实例讲述了JavaScript使用闭包模仿块级作用域操作。分享给大家供大家参考,具体如下:

在阅读这篇文章之前,建议先阅读JavaScript的作用域链以及JavaScript闭包。

正如闭包的定义一样:“闭包指的是有权访问另一个函数作用域中的变量的函数”, 闭包最大的意义就在于闭包可以对另一个函数作用域的变量进行访问,由此,闭包可以延伸出一系列的用法。

模仿块级作用域

JavaScript没有块级作用域的概念。这意味着在块语句中定义的变量,实际上是包含在函数中而非语句中创建的。从作用域链的角度来理解是,所有在函数内定义的变量(所有,也就是说块语句中定义的变量也包含在内)都会在这个函数执行时所创建的函数的活动对象中,因此从函数内的所有变量定义开始,就可以在函数内部随处访问它,闭包也可以通过作用域链访问它。
例子:

function outputNumbers(count){
  for(var i = 0; i < count; i++){
    console.log(i); // 0, 1, ... count - 1
  }
  console.log(i); // count
}

C++, JAVA等语言中,变量i只会在for循环的语句块(block)中有定义,循环一旦结束,变量i就会被销毁。可是在JavaScript中,变量i是定义在outputNumbers()的活动对象中,因此从函数内的所有变量定义开始,就可以在函数内部随处访问它,闭包也可以通过作用域链访问它。即使像下面这样重新声明同一个变量,也不会改变它的值。

function outputNumbers(count){
  for(var i = 0; i < count; i++){
    console.log(i); // 0, 1, ... count - 1
  }
  var i;     // redeclare i
  console.log(i); // count
}

JavaScript从来不管是否多次声明了同一个变量;遇到这种情况,JavaScript只会对后续的声明视而不见(不过会执行后续声明中的变量初始化),将其当成一个赋值语句。

函数包装器可以用来模仿块作用域并避免这个问题。

函数包装器就是创建并立即调用一个函数。

(function(){
  console.log("Hello World!");
})();

这段代码直接输出”Hello World”, 这就是一个函数包装器。

函数包装器的作用:

1. 立即执行函数中的代码,又不会再内存中留下对该函数的引用;

2. 函数内部的所有变量都会被立即销毁(除非将这些变量赋值给了包含作用域中的变量)。

当在函数内部使用函数包装器的时候,此时函数包装器就是一个闭包,有权访问外部环境中的所有变量。

function outputNumbers(count){
  (function(){
    //块级作用域
    for(var i = 0; i < count; i++){
      console.log(i); // 0, 1, ... count - 1
    }
  })();
  console.log(i); // error
}

在函数包装器中可以访问外部环境outputNumbers()的变量count,打印0, 1, … count - 1,但是在函数包装器执行完毕之后,再访问变量i就会抛出错误,因为i是在函数包装器中定义的,outputNumbers()函数无法访问。

无论在什么地方,如果只需要一些临时变量,就可以使用块级作用域!

使用函数包装器这种闭包可以减少闭包过多占用内存的问题。因为没有指向匿名函数的引用, 所以只要函数包装器执行完毕,就可以立即销毁其作用域链了。

函数包装器这种技术经常在全局作用域中被用在函数外部,从而限制想全局作用域中添加过多的变量和函数。一般来说,我们都应该尽量少向全局作用域中添加变量和函数。过多的全局变量和函数很容易导致命名冲突。通过创建块级作用域,每个开发人员既可以使用自己的变量,有不必担心搞乱全局作用域。例如:

(function(){
  var now = new Date();
  if (now.getMonth() == 0 && now.getDate() == 1) {
    console.log("Happy new year");
  }
})();

将这段代码放在全局作用域中,可以用来确定哪天是一月一日。其中变量now现在是匿名函数中的局部变量,避免了在全局变量中创建。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript之大字符串的连接的StringBuffer 类
May 08 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
Jun 06 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
JS实现字符串转日期并比较大小实例分析
Dec 09 Javascript
基于jQuery实现Tabs选项卡自定义插件
Nov 21 Javascript
Vue监听数据对象变化源码
Mar 09 Javascript
详细讲解vue2+vuex+axios
May 27 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 Javascript
JavaScript对象原型链原理解析
Jan 22 Javascript
JavaScript设计模式之原型模式详情
Jun 21 Javascript
JavaScript闭包与作用域链实例分析
Jan 21 #Javascript
js中事件对象和事件委托的介绍
Jan 21 #Javascript
JavaScript作用域链实例详解
Jan 21 #Javascript
Jquery的Ajax技术使用方法
Jan 21 #jQuery
js变量声明var使用与不使用的区别详解
Jan 21 #Javascript
Vue中Axios从远程/后台读取数据
Jan 21 #Javascript
vue项目中实现的微信分享功能示例
Jan 21 #Javascript
You might like
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
微信公众平台开发教程①获取用户Openid及个人信息图文详解
2019/04/10 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
Python对象的属性访问过程详解
2020/03/05 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
高中自我评价范文
2014/01/27 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
读书活动总结范文
2014/04/26 职场文书
护士实习求职信
2014/06/22 职场文书
平安工地汇报材料
2014/08/19 职场文书
少先队活动总结
2014/08/29 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技