一、闭包:
闭包就是把里面的函数保存到了外部形成的当内部函数被保存到了外部的时候,将会生成闭包。
function text() {
var num = 0;
function a() {
console.log(++num)
}
return a;
}
var text = text()
a()
上述就是闭包的基本结构,在函数里面定义函数,返回里面这个函数。这样就形成了闭包。
闭包的作用:
1、实现公有变量:函数累加器
不依赖函数变量,可以实现累加
2、使各个函数之间的变量更加严谨,更好的实现封装
基本的形式:
function test() {
var arr = []
for (var i = 0; i < 10; i++) {
arr[i] = function() {
console.log(i)
}
}
return arr
}
var a = test()
这个函数输出的为十个10
要解决这个问题,使其输出0-9十个数字,这就要提到立即执行函数了。
二、立即执行函数
(function (a,b){
console.log(a,b)}(1,2))
上述为基本形式。
立即执行函数可以加参数,可以由返回值。并且,只有表达式才能被执行。
如以下这个例子:
var demo = function(){console.log('a')}()
只要被这种定义的表达式调用之后,,就不是一个函数了,就没有了,所以会报错。
2、function text(){} 这叫函数声明,不是表达式,不能被执行
但是,在其前面加上表达式符号:— 、+、*、/ 之后就可以被执行,如:
-functoin text(){}();在前面加了+ - * |之后,就变成了个表达式
其中,外面的括号可以写到里面
上面的那个函数的解决办法就是要用到立即执行函数;
function test() {
var arr = []
for (var i = 0; i < 10; i++) {
// arr[i] = function() {
// console.log(i)
// }
(function(j) {
arr[i] = function() {
console.log(j)
}
}(i))
}
return arr
}
var a = test()
for (var j = 0; j < 10; j++) {
a[j]()
}
这样就解决了问题
以上,希望能对你有所帮助,谢谢