js闭包的特性和优缺点:JS基础入门闭包详细讲解
闭包是函数创建时作用域内所有变量的集合。要使用闭包,需要在另一个函数中创建一个函数,这种函数被称为嵌套函数。内部函数可以访问外部函数作用域中的变量(依靠闭包可以访问外部函数作用域),即使在返回外部函数之后也是如此。每次创建嵌套函数时都会创建闭包。
作用域链在继续了解闭包之前,首先了解一下JavaScript中的作用域链。
通常,有两种类型的作用域:
- 全局作用域
- 局部作用域
在JavaScript中,函数内部的变量在外部是不可见的。但是在块内的变量(if 或 while 之类)是可见的。
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函数的所有对象属性。
如果在浏览器中查看控制台,可以在Scopes数组中看到Closure对象。
由于内部函数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没有像其他面向对象语言一样的访问修饰符,例如 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(); // S1console.log(x);var y = studnetEnrollment(); // S2 console.log(y);
count和prefix是两个私有变量,任何人都无法进行更改,只能访问内部函数(即代码中的innerFunc)。只有名为闭包的功能才能对此进行访问。
- 第一次调用studentEnrollment函数时,函数内的count变量由innerFunc函数递增加1。
- 第二次,增加上一个计数值,即 1 增加到 2
- Closure功能可以实现这些功能。
闭包是外部函数中的变量集合,它提供对内部函数作用域的访问以保护全局命名空间。
闭包使开发人员能够编写像面向对象语言那样的干净代码,这些代码不会混淆全局和局部变量的名称。
- 11-15linux服务器购买及配置:如何配置,Linux软件商店的服务器地址
- 12-20五花肉最好吃的做法不油不腻贼香,五花肉的经典做法老菜新做
- 05-13谁天生是猪鼻子 除了猪猪谁还长猪鼻子
- 09-16汽车排气管数量代表什么?为什么有的汽车排气管数量多
- 11-18converse性价比最高的鞋 潮鞋丨陈冠希,xConverse再推联名
- 03-18opporeno4pro怎么开防抖?过山车级防抖是怎么做到的
- 09-29兰心书院怎么分享?成就万千女性的听书成长之旅
- 10-2850首让孩子学会表达的儿歌:10首朗朗上口的儿歌轻松记忆好理解
- 01-12中兴正式发布了天机axon 10 pro 中兴天机Axon10,Pro推送Android10更新
- 03-02王羲之写的楷书作品,王羲之写得最好的楷书赏析
- 05-07怎样从旧手机导入到新手机:怎么把旧手机的内容导入到新手机里
- 04-18抖音口播的时长限制是怎么规定的?抖音出了新的规则你知道吗
- 01-15农历12月也称为腊月吗?把农历十二月称为腊月
- 01-29劳动合同一般签几年比较有利呢:劳动合同一般签几年最好
- 11-10家用数码备份 用移动硬盘还是nas:个人数据备份,U盘移动硬盘
- 12-12小学生名人名言,名人名言
热门
推荐
- 1武警部队入党申请书范例239
- 2最佳学生班主任评语174
- 3建筑节能的论文代发481
- 4尤克里里跟吉他的区别305
- 5茶道茗理的简介257
- 6二年级看的成语故事书中的故事117
- 7销售年度工作总结范文大全355
- 8调整工资会议纪要格式140