函数作用域

JavaScript具有函数作用域,主要具有这几点好处:

  1. 隐藏内部实现,符合软件设计中的最小特权原则。
  2. 规避冲突。函数作用域可以当做命名空间隐藏变量,避免暴露到全局作用域发生冲突。

块作用域

虽然函数作用域是JavaScript中最常见的作用域单元,但块作用域在JavaScript中也是存在的,只不过(个人理解)JavaScript中的块作用域只是针对块中的某个变量 来说的。

举例: java中的块作用域如下,在if块中声明的所有变量都只在if块中有效

1
2
3
4
5
    if (true) {
        int i = 0;
        int j = 0;
        ....
    }

JavaScript中的"块作用域"

1
2
3
4
    if (true) {
        let i = 0
        var j = 0
    }

在如上块中,我们只能说被let声明的变量i 具有块作用域的性质,并不能理解为整个if块都是块作用域,很显然被var声明的变量j在 块外部也是可以被访问到的。

with

with是块作用域中的一个例子,with创建的新作用域只在with块中有效,并且只有被with的这个变量具有块作用域的性质。

try/catch

try/catch中的err变量具有块作用域的性质,并且只有这个变量有这个性质。

let,const

ES6中被let或者被const声明的变量具有块作用域的性质