闭包的概念
1. 是一个函数,这个函数有权访问另一个作用域中的变量。
2. 另一种说法,当内部函数的生命周期大于外部函数的声明周期,而内部函数以某一种方式被外部作用域访问时,闭包就产生了。
如下闭包的代码和解释
function mainfn() {
var num = 10;
//写法1
// function fun() {
// console.log(num);
// }
// return fun;
//写法2
return function () {
console.log(num); // 10
}
}
var havefn = mainfn();
havefn(); //num我们可以拆解为几个部分
1. mainfn函数里面有内部的返回值return且就是一个函数。
2. return的这个函数内部打印了num变量。为什么能够打印num变量,原因在于作用域链的访问机制,内部函数可以访问外部函数,下面会补充作用域和作用域链的知识点。
3. 我们在外部用havefn变量接受了mainfn(),也就是接受了mainfn的返回值【内部函数,相关执行或返回值等。。。】
4. 紧接着调用havefn函数,此时也调用了mainfn里面的内部函数,所以最终能够打印变更num =10
知识点的解释:
1. 作用域:
变量在某个范围内起作用,超出了这个范围,就不起作用。这个范围就是作用域。作用域在函数的定义时就产生,而不是函数调用时产生的。
2. 作用域链:
一句话概括:根据【内部函数可以访问外部函数变量】,采用就近原则一层一层向上查找变量,这个机制就叫作作用域链。
函数A包含了函数B,那么函数B就是函数A的内部函数,
而内部函数如果要使用一个变量,首先看自己内部有没有这个变量,
如果没有,就会去紧挨着的上一级查找,【就近原则】
如果函数一层一层都找不到,最后才会去全局变量下面找。
var a = 1;
var b = 11;
function fn1() {
var a = 2;
var b = '22';
fn2();
function fn2() {
var a = 3;
fn3();
function fn3() {
var a = 4;
console.log(a); // 4
console.log(b); // '22'
}
}
}
fn1();
闭包是JavaScript中的一种重要概念,它允许内部函数访问并操作外部函数的变量。当内部函数的生命周期超过外部函数时,闭包产生。作用域决定了变量在何处可见,而作用域链确保内部函数能按需查找外部作用域的变量。在给定的例子中,`mainfn`创建了一个闭包,因为`havefn`能访问`mainfn`内的`num`变量。这种机制在函数嵌套和数据封装中非常关键。

被折叠的 条评论
为什么被折叠?



