作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量,内部函数拥有比它的外部函数更长的生
命周期。
var Book = function(name) {
return {
get_name: function() {
return name;
}
};
};
var book = Book("javascript");
函数可以访问它被创建时所处的上下文环境
理解内部函数能访问外部函数的实际变量而无须复制是很重要的。这个知识点的关键在“能直接访问” + “无须复制”:
使用这段代码测试:
var aa = function() {
var result = []
for( var i = 0; i < 4; i++) {
result.push( function() {
console.log(i);
});
}
return result;
}
var functionList = aa();
for( var j = 0; j < functionList.length; j++){
functionList[j]();
}
第一次循环:闭包内的 i 等于 外部函数的i:
第二次循环之后,两个闭包内的i都变为1了:
因此,毫无疑问,最后的输出结果是4个4:
solution:如下代码将打印0,1,2,3:
function geneator(i) {
return function() {
console.log(i);
};
}
var aa = function() {
var result = []
for( var i = 0; i < 4; i++) {
result.push( geneator(i));
}
return result;
}
var functionList = aa();
for( var j = 0; j < functionList.length; j++){
functionList[j]();
}
第一次循环:
第二次循环:
核心思想就是“避免在循环中创建函数,先在循环之外创建一个辅助函数,让这个辅助函数再返回一个绑定了当前i值的函数”