JavaScript捷径:基本指南

引起您注意的是Parathan Thiyagalingam发表在medium.freecodecamp.org上的一篇文章的译文。 是否想知道JavaScript闭包是如何工作的? 看猫下!


照片奥斯汀· 迪斯泰尔与不飞溅

闭包是函数创建时范围内所有变量的组合。 要使用闭包,您需要创建一个嵌套函数,即函数内部的一个函数。 即使在外部函数完成之后,内部函数也可以访问外部函数范围内的变量。 (提供此访问权限的是闭包 。)每次创建函数时,都会创建闭包。

在开始理解闭包的概念之前,请考虑一下JavaScript中的作用域链。

通常,可见性区域分为两种:全局和局部。

在JavaScript中,无法从外部访问函数内部的变量-例如,与块内的变量不同(例如ifwhile )。

基于此,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.dir代替console.log来显示所选对象的所有属性。
  • 变量x被分配给app函数,然后该函数返回add函数。 这使您可以查看add函数的对象的所有属性。

如果在浏览器中打开控制台,则将在Scopes数据数组内找到Closure对象。



由于add内部函数可以访问属于外部函数的变量bd ,因此这两个变量将作为引用添加到Closure对象中。
考虑另一个封闭示例。

 var a = 10; var startFunc; function app(){ var b = 2; function add(){ var c = a + b; console.log(c); } startFunc = add(); } app(); // Invoke the app function startFunc; // as the app function invoked above will assign the add function to startFunc & console the value of c 

  • startFunc全局函数分配了add函数,它是父函数appstartFunc
  • 仅在调用app函数后才有可能。 否则, startFunc函数的行为将类似于没有分配值的全局变量。

如何在JavaScript中使用闭包


我们中的许多人在编写代码时都使用闭包,但他们并不完全理解为什么这样做。 JavaScript缺少面向对象编程语言中的publicprotectedprivate修饰符。 因此,为了阻止对外部代码的命名空间的访问,我们不得不借助函数的帮助。

而且,由于我们在谈论功能-在声明后立即启动立即调用的功能(IIFE) 。 她甚至不需要被叫。

IIFE语法如下所示:

 (function(){ //variables & scope that inside the function })(); 

考虑以下示例:

 var studnetEnrollment = (function () { //private variables which no one can change //except the function declared below. var count = 0; var prefix = "S"; // returning a named function expression function innerFunc() { count = count + 1; return prefix + count; }; return innerFunc; })(); var x = studnetEnrollment(); // S1 console.log(x); var y = studnetEnrollment(); // S2 console.log(y); 

countprefix是两个不能更改的私有变量。 仅内部函数(在我们的例子中,这是innerFunc函数)才可以访问它们。

  • 首次调用studentEnrollment函数时, studentEnrollment函数studentEnrollment count变量的值增加到1。
  • 第二次, count从1增加到2。
  • 所有这些只有通过关闭才能实现。

结论


闭包是外部函数的一组变量,因此内部函数的范围可以访问这些变量。 这样可以保护全局名称空间。

闭包功能允许开发人员编写简洁的代码-例如,采用面向对象的编程语言,即不会混淆全局变量和局部变量的代码。



编码不错!

Source: https://habr.com/ru/post/zh-CN450988/


All Articles