JavaScript闭包的重难点剖析

JavaScript闭包的重难点剖析

作用域的基本介绍:指变量能够被访问到的范围
ES5之前有函数作用域和 全局作用域
ES6出现之后:新增块作用域
在JavaScript中的全局作用域,全局变量是挂载在window对象下的变量所以在网页中的任何位置你都可以使用并且访问到这个全局变量
下面用代码来体验一下全局作用域:

var globalName ='global';
function getName(){
console.log(globalName)// globalvar name = 'inner'
console.log(name)// inner}
getName();
console.log(name); //
console.log(globalName);//global
function setName(){
vName = 'setName';
setName();
console.log(vName);//setName
console.log(window.vName)//setName

全局变量也会有一些弊病:定义很多全局变量的时候会容易引起变量名的冲突
函数作用域:
该作用域只能在函数内部才能访问到,当这个函数执行完之后,这个局部变量也相应会被销毁

function getName(){var name = 'inner';
console.log(name);//inner}
getName();
console.log(name);

块级作用域:
最直接的表现就是新增的let关键词使用let关键词定义的变量只能在块级作用域访问
特点:暂时性死区即这个变量在定义之前是不能被使用的
例如:在JS编码过程中if语句以及for语句后面的{…}这里面所包含的就是块级作用域
代码实例:

console.log(a)//a is not definedif(true){
let a= '123'
console.log(a);//123
console.log(a)//a is not defined

红宝书闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数
MDN:一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)
也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域
这是二者给出的关于闭包的官方说明。
闭包的基础概念:闭包其实就是一个可以访问其他函数内部变量的函数,通常情况下,函数内部变量是无法在外部访问的,因此闭包的作用就具备了实现能在外部访问某个函数内部变量的功能

function fun1(){
var a= 1;
return function(){
console.log(a);};
}
fun1();
var result= fun1();
result();// 1

闭包产生的原因:
作用域链的基本概念:
当访问一个变量时,代码解释器会首先在当前的作用域查找如果没找到,就去父级作用域去查找直到找到该变量或者不存在父级作用域中
代码图片如下
在这里插入图片描述
所以可以得出闭包产生的本质就是:当前环境存在指向父级作用域的引用
代码如下:

function fun1(){vara=2
function fun2(){
console.log(a); /2}
return fun2;
var result = fun1();result();

有一个误区:大家都认为只有返回函数了才算产生了闭包,其实并不是这样的,我们这需要让父级的作用域引用存在就是闭包
在这里插入图片描述
第三点:作为函数参数传递
第四点
在这里插入图片描述
上述文章如果有问题或者想问问题或者想交流技术或者想和作者闲聊可以+QQ:2029788643

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值