导语: 面试说到作用域, 有的时候网上看到别人说 是运行时确定的,还有说是书写的时候就已经确定,为了弄懂作用域到底是个什么玩意,特别看了
你不知道的 javascript对作用域的解释, 从而汇总了笔记 和自己的理解, 如果有误麻烦指出
词法作用域
定义:
- 词法作用中有: 函数作用域, 块级作用域,这些都是在
书写时候就已经被确定了作用范围, 例如let,const在声明的时候, 就已经确定的在该{}中的范围, 因此只关注在何处声明了 词法作用域有唯一性,也就是说不会出现 词法作用域有交集的情况词法作用域逐级,依次往外查找- 遮蔽效应: 内部作用域变量会遮蔽同名的 外部作用域变量
函数作用域
- 利用函数作用域,外层无法访问到内层的数据的这一特性, 可以用来模拟 private 达到
最小暴露变量和函数
function doSomething(a) {
function doSomethingElse(a) {
return a - 1;
}
var b;
b = a + doSomethingElse( a * 2 );
console.log( b * 3 );
}
doSomething( 2 ); // 15
- 利用函数作用域, 可以避免命名冲突
- 利用函数作用域,可以生成函数表达式
注意 这种方式, 可以在 webpack 中看到, 被打包之后的代码
(function foo () {
...
}) // 函数表达式
- 立即执行函数中的函数作用域 (IIFE)
var a = 2;
(function foo() {
var a = 3;
console.log( a ); // 3
})();
console.log( a ); // 2
or
(function(){ .. }())
相较于传统的 IIFE 形式,很多人都更喜欢另一个改进的形式:(function(){ .. }())。仔 细观察其中的区别。第一种形式中函数表达式被包含在 ( ) 中,然后在后面用另一个 () 括 号来调用。第二种形式中用来调用的 () 括号被移进了用来包装的 ( ) 括号中。
块级作用域
- 利于垃圾回收
let,const都是有自己的块级作用域try和catch也都有自己的块级作用域