学习笔记=>《你不知道的JavaScript,上卷》第三章:函数作用域和块级作用域

3.1 函数中的作用域

  (1)JavaScript具有基于函数的作用域,每声明一个函数的时候会为其自身创建一个‘气泡’,这个气泡内声明的变量或函数外界无法访问。

函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数范围内使用及复用(事实上在嵌套的作用域中也可以使用)。

3.2 隐藏内部实现

  例子:

var a = 666;

function sum(b){
      return a + b;
}

function test(){
    var b = sum(5) + 10;
console.log(b); }

  这个例子中变量a和方法sum实际上只会在方法test中使用,依照最小特权原则

最小特权原则也称为最小授权原则和最小暴露原则,这个原则是指在软件设计中,应该最小限度的暴露必要的内容,将不必暴露的内容隐藏起来。

  以上实例应该改为:

function test(){
    var a = 666;

    function sum(b){
          return a + b;
    }

    var b = sum(5) + 10;
  console.log(b);
} 

3.3 函数作用域

  将任意代码添加添加包装函数,可以将其中的变量和函数隐藏起来,外部作用域无法访问包装函数里面的变量和函数。

var a = 2;

function foo(){
     var a = 3;
     console.log(a);    //3
}

foo();

console.log(a);     //2

  但是还有点不好的地方,实际上还是创建了一个外部的foo函数,它本身就污染了所在作用域,

  且需要在后面调用执行。这个时候可以使用IIFE(自执行),改为:

var a = 2;

;(function(){
       var a = 3;
       console.log(a);   //3
})();

console.log(a);    //2

3.4 块作用域

  JavaScript中实现块作用域有以下几种方式:

    with:用with从对象中创建出来的作用域仅在with声明中有效,外部无效。

    try/catch:ES3规范中规定,try/catch的catch语句会创建一个块级作用域,其中声明的变量只在catch语句中有效。

    let:let可以将变量绑定到所在的任意作用域中,也就是说,let声明的变量,隐式的绑定在本身所在的作用域中。

const:声明一个不可修改的变量

//便于可读,我们可以显示的为块作用域添加块

var a = true;

if(a){
    {    //显示的创建块
          let b = 666;
          console.log(b);
    }
}

  总结:JavaScript是基于函数作用域的,每次声明一个函数,函数中包含的变量和函数外部作用域无法访问。我们可以通过包装函数将不必要对外暴露的变量或函数包装隐藏起来。也可以通过IIFE(自执行函数)来隐藏变量和函数。js中的块级作用域实现方式有with(不要使用),try/cath的cath语句,let,const等。