做用域應用的特殊狀況(有兩種):
函數做爲參數被傳遞
函數做爲參數被返回閉包
function print(fn){ let a = 200 fn() } let a = 100 function fn(){ console.log(a) } print(fn) //100
function create(){ let a = 100 return function(){ console.log(a) } } let fn = create() let a = 200 fn() //100
當前做用域沒有定義可是使用了,須要咱們去沿着做用域鏈查找的變量。函數
在函數定義
的地方,向上級做用域查找,而不是執行的地方!!!工具
function createCache(){ let data = {} //閉包中的數據,被隱藏,不被外界訪問 return { set(val, key){ data[val] = key }, get(key){ return data[key] } } } let c = createCache() c.set('a', 100) console.log(c.get('a')) //100(這樣就只能經過c.get和c.set來訪問和設置data, 而不能再函數外隨意修改和獲取data的值)