作用域
基础
全局作用域只有一个,每个函数又都有作用域(环境)。
- 编译器运行时会将变量定义在所在作用域
这意味着:作用域链取决于【上下文环境(函数是怎么被定义的)】,而不是【函数是怎么被调用的】。其作用域链在编译时就已经确定了,而不是运行时。
- 使用变量时会从当前作用域开始向上查找变量
let/const
使用 let/const
可以将变量声明在块作用域中(放在新的环境中,而不是全局中)
匿名函数
匿名函数就是没有函数名的函数,如下:
// 定义一个匿名函数 let myFunc = function(){};
闭包
- 闭包是声明在函数里面的函数
- 闭包指子函数可以访问外部作用域(必须在作用域链上)变量的函数特性,即使在子函数作用域外也可以访问。
- 闭包会保留上级作用域,可能会导致内存泄漏。
实例代码
let outermostVar = 'outermost var'; function outer() { let outerVar = 'outer var'; function inner() { console.log(outermostVar); console.log(outerVar); console.log(testVar); } inner(); } /** * 立即执行函数,测试闭包 */ (function() { let testVar = 'test Var'; // outermostVar 和 outerVar 可以正常访问到 // 但是访问不到 testVar // 原因:作用域链取决于【函数是怎么被定义的】 outer(); })();
参考
http://houdunren.gitee.io/note/js/9%20作用域与闭包.html