2、闭包概念(蝴蝶书)
- 作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量(除了this和arguments)。
3、当初栽了的问题
//闭包经典问题,输出2,2,为什么?
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i);
},0);
}
原因:
- 函数内部绑定了变量i本身,而不是函数在构造时的变量i的值
修改,输出0,1
- 再循环之外创建辅助函数
function helper(i){
console.log(i)
}
for(var i=0;i<2;i++){
setTimeout(
helper(i)
,0);
}
4、对闭包内部变量内存不被释放的应用
- 函数记忆(多么高大上的名字),
- 斐波那契数列
- 普通递归
- 斐波那契数列
var fibonacci = function(n){
return n<2 ? n: fibonacci(n-1)+fibonacci(n-2);
};
for (var i = 0; i<=10; i++){
console.log(fibonacci(i))
}
- 闭包优化
在一个名为memo的数组里保存结果。当函数被调用时,首先检查结果是否存在,如果存在,就立刻返回结果
var fibonacci = function() {
var memo = [0, 1];
var fib = function (n) {
var result = memo[n];
if (typeof result !== 'number') {
result = fib(n - 1) + fib(n - 2);
memo[n] = result;
};
return result;
}
return fib
}()