########js鏈式作用域:
1徽级、子對象會一級一級向上尋找父對象的變量,父對象的所有變量聊浅,對子對象都是可見的
2餐抢、父對象無法獲取子對象內的局部變量
########從外部讀取局部變量
方法:在函數(shù)的內部现使,再定義一個函數(shù)。
內部函數(shù)可以讀取外部函數(shù)的局部變量旷痕,那把內部函數(shù)作為返回值碳锈,就可以在外部函數(shù)讀取內部函數(shù)的變量了。
閉包
閉包就是能夠讀取其他函數(shù)內部變量的函數(shù)
在立即執(zhí)行函數(shù)中
Paste_Image.png
在一個立即執(zhí)行函數(shù)中欺抗,有一個局部變量local殴胧,有一個函數(shù)foo,foo里面可以訪問到local變量佩迟,這就是一個閉包团滥。
function foo(){
var local = 1;
function bar(){
local++;
return local;
}
return bar;
}
var func = foo();
func();
這里,local變量和bar函數(shù)組成了一個閉包报强。
因為需要局部變量灸姊,所以把local放在一個函數(shù)里,函數(shù)套函數(shù)只是為了造出一個局部變量秉溉,與閉包無關力惯。
return bar只是為了bar能被使用,也與閉包無關召嘶。
閉包用途
1父晶、讀取函數(shù)內部的變量
2、讓這些變量的值始終保持在內存中
************我是分割線*******************************
例子:讓下面的函數(shù)輸出3
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i]=function(){
return i;
};
}
console.log( fnArr[3]() );//10
1弄跌、形成閉包:加入立即執(zhí)行函數(shù)
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(n){
fnArr[i]=function(){
return n;
};
})(i);
}
console.log( fnArr[3]() );//3
2甲喝、形成閉包
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(){
var n=i;
fnArr[i]=function(){
return n;
};
})();
}
console.log( fnArr[3]() );
3、形成閉包
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] =(function(){
var n=i;
return function(){
return n;
}
})();
}
console.log( fnArr[3]() );
此篇僅是看過的幾篇關于閉包文章的一個筆記而已铛只,摘取了一些文章的精華記錄下來:
https://zhuanlan.zhihu.com/p/22486908JS 中的閉包是什么埠胖?
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html學習Javascript閉包(Closure)