首先 ==》我是通过学习阮一峰先生的代码来看闭包思想的
- 闭包简单来说,就是为了外部变量读取局部变量
变量访问:
局部变量-------外部变量 ok
外部变量-------局部变量 no
为了解决外部变量访问不了内部变量、变通
变量访问:
局部变量-------外部变量 ok
外部变量-------return 局部变量 ok
将内部变量放在放在一个函数之中,然后return回去,这就是所谓的闭包(没有那么高大上,就是打包后,别人就能用)
- 闭包的另一个作用,就是保持内部变量在内存中
对以上代码的解释
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,
第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除
闭包:另一个理解版本
作用域
javascript 中有全局作用域和局部作用域。局部作用域中可以访问全局作用域中的变量和方法等,但是反过来却不行。我们总结为:以小见大。 下面我们通过一段代码来理解:
var scope="global";//外部变量1
var scope2 = 'winki'//外部变量2
function scopeTest(){
console.log(scope);//打印出 undefiend
var scope="local"
console.log(scope2)//打印出 winki
}
scopeTest(); //调用方法
从这段简单的代码我们可以看出几个点:
-
函数内部变量,先使用,后声明,打印undefined。
-
如果函数内部,函数外部有同名变量,由内往外寻找,找到则不再寻找。
-
变量声明不加var,默认使用该同名变量为全局变量。
-
闭包:闭包的内部函数返回的始终是最后一个值,假如把闭包放在一个循环中,内部函数返回的始终是最后一个值:
(function time(){
for(var i=0,i<5;i++){
setTimeOut({
console.log(i)//打印出i
},1000)
}
})()
打印结果:5个5
. 从以上我们可以看出几个点:
- 函数内部返回的值始终是最后一个。
闭包
概念:
js高程对闭包的定义是:闭包是指有权访问另一个函数作用域中的变量的函数。 创建闭包的常见方式就是在一个函数内部创建另一个函数,作为返回值或参数传递到函数外部。但是根据我的经验,只要在一个函数内部使用了关键字function,一个闭包就被创建了。总而言之:处处都是包,基本所有的js中都必须用到function
例子:
var a = 1;
function test(){//包1
var b = 2;
return function(){//包2
var c = 3
console.log(a+b+c)
}
}
var result = test()
result();//6
解释以上代码:包1 是对于全局环境来说的。包2是对于test()函数来说的。
注意点:
- 每次调用函数,如果函数中使用闭包,都将创建一个船新的闭包
- 闭包放在循环中,闭包中可以使用的变量的值,取决于包含函数的最后一个值。解决方法:让闭包立刻执行。
- 闭包容易造成内存泄漏:假如闭包中包含html元素,该元素将不会被销毁。
- 闭包容易占用内存:由于闭包携带了它的函数作用域,所以它比普通元素会多占内存