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里的条件判断
Feb 27 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
Aug 25 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
javascript使用prototype完成单继承
Dec 24 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
Aug 23 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
Dec 03 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
七行JSON代码把你的网站变成移动应用过程详解
Jul 09 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 Javascript
JS删除对象中某一属性案例详解
Sep 08 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
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
表格 隔行换色升级版
2009/11/07 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
小程序实现留言板
2018/11/02 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
python时间time模块处理大全
2020/10/25 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
咖啡店自主创业商业计划书
2014/01/22 职场文书
临床护士自荐信
2014/01/31 职场文书
市场部经理岗位职责
2014/04/10 职场文书
音乐幼师求职信
2014/07/09 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
初三化学教学反思
2016/02/22 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书