做用域应用的特殊状况(有两种):
函数做为参数被传递
函数做为参数被返回闭包
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的值)