疯狂的技术宅

以前出于工作目的,编写和翻译了大量的技术文章,以前端为主,删掉了过时的、毫无营养的内容,留下的都是精华。


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于本站

  • 回到主站

  • 搜索

JavaScript 闭包基本指南

时间: 2019-05-05 分类: 前端技术   字数: 1323 字 阅读: 3分钟
标签: #JavaScript# #闭包#
  • 本文译自:https://medium.freecodecamp.org/a-basic-guide-to-closures-in-javascript-9fc8b7e3463e
  • 译者:疯狂的技术宅

闭包是函数创建时作用域内所有变量的集合。要使用闭包,需要在另一个函数中创建一个函数,这种函数被称为嵌套函数。内部函数可以访问外部函数作用域中的变量(依靠闭包可以访问外部函数作用域),即使在返回外部函数之后也是如此。每次创建嵌套函数时都会创建闭包。

在继续了解闭包之前,首先了解一下JavaScript中的作用域链。

通常,有两种类型的作用域:

  • 全局作用域
  • 局部作用域

在JavaScript中,函数内部的变量在外部是不可见的。但是在块内的变量(if 或 while 之类)是可见的。

因此,JavaScript有函数作用域。没有块作用域。

var a = 10;
function app(){
   var b = 2;
   console.log(a); // 10
   console.log(b); // 2
}
console.log(b); //   ReferenceError: b is not defined
app();

正像我们已知的那样,a 是一个全局变量并且 b 是一个局部变量,它是app函数独有的。

我们无法从局部作用域之外获取局部变量的值。

使用嵌套函数 —— 函数内部的函数

var a = 10;
function app(){
     var b = 2;
     var d = 3;
  function add(){
     var c = a + b;
   }
 return add;
}
var x = app();
console.dir(x);

在这里app是父函数,add函数是子函数。

  • 代码中没有用 console.log 而是用了console.dir 来输出指定JavaScript对象的所有属性,这有助于开发人员获取对象的属性
  • 变量 x 被分配给app函数,app函数返回add函数。因此我们可以看到add函数的所有对象属性。

如果在浏览器中查看控制台,可以在Scopes数组中看到Closure对象。

img

由于内部函数add访问外部函数变量b 和 d,因此这2个变量将被添加到Closure对象中以供引用。

让我们看看下一个例子:

var a = 10;
var startFunc;
function app(){
      var b = 2;
   function add(){
      var c = a + b;
      console.log(c);
   }
   startFunc = add();
}
app(); // 调用app函数
startFunc; // 上面调用的app函数会将add函数赋值给startFunc并输出c的值
  • 一个名为 startFunc 的全局函数被分配给add函数,该函数是 app 函数的子函数。
  • 这只有在调用 app 函数后才有可能,否则 startFunc 将作为全局变量而不被分配任何值

在JavaScript中使用闭包

很多人在编码时会用到闭包,但是不明白用它的原因。 JavaScript没有像其他面向对象语言一样的访问修饰符,例如 private,public,protected。不过我们可以利用函数来保护命名空间免受外部代码使用的影响。

特别是在函数中,**立即执行函数表达式(IIFE)**是在声明之后会立即执行的函数表达式。在声明函数之后,你不需要去调用该函数。

IIFE的语法定义是:

(function(){
             //函数内部的变量和作用域
})();

举个例子:

var studnetEnrollment = (function () {
    //私有变量,任何人都无法改变
    //除了下面声明的函数
     var count = 0;
     var prefix = "S";
    // 返回一个命名函数表达式
     function innerFunc() {
         count = count + 1;
         return prefix + count;
     };
 return innerFunc;
})();
var x = studnetEnrollment(); // S1
console.log(x);
var y = studnetEnrollment(); // S2 
console.log(y);

count和prefix是两个私有变量,任何人都无法进行更改,只能访问内部函数(即代码中的innerFunc)。只有名为闭包的功能才能对此进行访问。

  • 第一次调用studentEnrollment函数时,函数内的count变量由innerFunc函数递增加1。
  • 第二次,增加上一个计数值,即 1 增加到 2
  • Closure功能可以实现这些功能。

结论

闭包是外部函数中的变量集合,它提供对内部函数作用域的访问以保护全局命名空间。

闭包使开发人员能够编写像面向对象语言那样的干净代码,这些代码不会混淆全局和局部变量的名称。

编码快乐…… !!!!!

标签: #JavaScript# #闭包#

标题:JavaScript 闭包基本指南

链接:https://fe-tech.viewnode.com/post/201905/05/

作者:疯狂的技术宅

声明: 本博客文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议( 知识共享署名-非商业性使用-禁止演绎 4.0),转载请注明出处!

用Node.js创建安全的 GraphQL API
浏览器中的JavaScript:文档对象模型与 DOM 操作
  • 文章目录
  • 站点概览
疯狂的技术宅

疯狂的技术宅

退休程序员,硬件发烧友,人工智能爱好者。写写代码喝喝茶,晒晒太阳带带娃。

457 日志
8 分类
583 标签
GitHub
友情链接
  • viewnode
  • mofish
标签云
  • Javascript 172
  • Node.Js 62
  • Vue 36
  • Typescript 28
  • 实战项目 28
  • 面试 21
  • React 20
  • Css 17
  • 面试题 16
  • 教程 13
  • Promise 12
  • Chrome 9
  • Debug 9
  • 调试 9
  • 资源 9
  • Deno 8
  • Dom 8
  • 杂谈 8
  • 正则表达式 8
  • 测试 8
    • 使用嵌套函数 —— 函数内部的函数
    • 在JavaScript中使用闭包
    • 结论
© 2018 - 2022 疯狂的技术宅 All Rights Reserved
Powered by - Hugo v0.99.0 / Theme by - NexT
Storage by 俺的服务器 / 冀ICP备2022010157号
0%