关于闭包那些事儿
本文作者:vicky 原文出处:http://www.mamicode.com/info-detail-500673.html
图片发自小瓶子的简书App1.function 函数不仅可以调来调去,还可以作为值传来传去
2.scope 作用域 (块级作用域,基于函数的作用域)
清晰的讲述作用域http://www.jianshu.com/p/a7f9951f329a
函数作用域是function内 在es5 与es6中没有改变
块级作用域是在es6中体现的 if(){} while(){} 必须用let const 来声明变量,这样才能保证外部不访问块级中的变量(感谢作者 让我清晰的明白)
3.闭包 简单的说就是一个函数里嵌套这函数,闭包所保留的是整个变量对象。来看一个闭包经典案例
for(var i=1; i<=9; i++) {
setTimeout(function timer(){
console.log( i );
},1000);
}
执行结果 输出十次10 原因是 setTimeout是异步执行 ,setTimeout中的匿名function没有将 i 作为参数传入来固定这个变量的值, 让其保留下来, 而是直接引用了外部作用域中的 i, 因此 i 变化时, 也影响到了匿名function。若改为
for(let i=1; i<=9; i++) {
setTimeout(function timer(){
console.log( i );
},1000);
}
运用闭包
function Person(name) {
function getName() {
console.log( name );
}
return{
getName: getName
};
}
var littleMing = Person( "fool");
littleMing.getName();