函数存在函数环境和函数的作用域。函数打个比喻就像是一座城市,如果有人在住在城市,那城市就是存在的。如果没有住,那城市会被销毁。城市就是函数的环境,城市里面有公园,学校等之类的。学校就是上课的作用范围,我们规定了上课的作用域就在学校。
function city() {
var park = {
green: '草地'
}
var school = {
work: '上课'
}
}
拿代码说。就是有一个函数(city),现在没人去用它,所以它是被销毁的。函数里面有变量park,park和school的作用域就是在city里面。然后school的work的作用域,也是在school里面。
function city() {
var park = {
green: '草地'
}
var school = {
work: '上课'
}
}
city();
city();
let a = city();
这边调用了两次的city的方法,按照上面的逻辑,如果没人用city的函数,那么city是被销毁的。现在用了city(); 那么会被内存创建出来,执行完毕后,又会被销毁。不管执行N次city的方法,只要外面没人引用,就会被销毁。最后一个有a引用它。所以,这个city的内存地址是不会被销毁的。当然,这个内存地址和前两个是完全不一样的,都是独立的内存地址。
function city() {
var name = null;
var park = {
green: '草地'
}
var school = {
work: '上课'
}
return function shanghai() {
if (name) {
console.log('存在了');
} else {
name = '上海';
}
}
}
city()();
city()();
let a = city();
a();
a();
从上面的代码来理解。前面两个city()创建出来后,因为没有人引用它。所以它执行完毕后悔被销毁。下面有a引用了,所以当前shanghai这个方法和作用域下的变量都会被保存在内存里面,不会被销毁。所以在第二次a();的时候,就会log名字我们已经被赋值了。那么上面的情况就称作闭包。
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域
- 闭包的定义
- 闭包允许函数访问并操作函数外部的变量。
- 保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
- 保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化。
网友评论