闭包是函数创建时作用域内所有变量的集合 。要使用闭包 , 需要在另一个函数中创建一个函数 , 这种函数被称为嵌套函数 。内部函数可以访问外部函数作用域中的变量(依靠闭包可以访问外部函数作用域) , 即使在返回外部函数之后也是如此 。每次创建嵌套函数时都会创建闭包 。
![JS基础入门:闭包详细讲解](http://img.jiangsulong.com/220401/23324H3F-0.jpg)
文章插图
【JS基础入门:闭包详细讲解】
作用域链在继续了解闭包之前 , 首先了解一下JAVAScript中的作用域链 。
通常 , 有两种类型的作用域:
- 全局作用域
- 局部作用域
var a = 10;function App(){ var b = 2; console.log(a); // 10 console.log(b); // 2}console.log(b); // ReferenceError: b is not definedapp();正像我们已知的那样 , 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函数的所有对象属性 。
![JS基础入门:闭包详细讲解](http://img.jiangsulong.com/220401/23324JI0-1.jpg)
文章插图
由于内部函数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 将作为全局变量而不被分配任何值
特别是在函数中 , **立即执行函数表达式(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(); // S1console.log(x);var y = studnetEnrollment(); // S2 console.log(y);count和prefix是两个私有变量 , 任何人都无法进行更改 , 只能访问内部函数(即代码中的innerFunc) 。只有名为闭包的功能才能对此进行访问 。
- 第一次调用studentEnrollment函数时 , 函数内的count变量由innerFunc函数递增加1 。
- 第二次 , 增加上一个计数值 , 即 1 增加到 2
- Closure功能可以实现这些功能 。
闭包使开发人员能够编写像面向对象语言那样的干净代码 , 这些代码不会混淆全局和局部变量的名称 。
推荐阅读
- 互联网营销是什么?互联网营销怎么做?零基础学习互联网营销技巧
- 大神的Javascript基础总结
- JS基础入门:严格模式
- JS基础入门:事件捕获与事件冒泡
- 抖音:从入门到运营,全攻略
- 玄空风水基础知识的细节精髓
- SQL基础语法
- 一天快速入门python
- 红茶超全的基础知识介绍 了解红茶看这篇就够了
- 古汉语文字学 古汉语文学基础