函数作用域

  • 每声明一个函数,都会为其自身创建一个作用域“气泡”
  • 函数作用域指,属于这个函数的全部变量都可以在整个函数的范围内使用及复用(嵌套的作用域中也可以使用)

P.S

  • 最小暴露原则:在软件设计中,应该最小限度地暴露必要内容,而将其他内容都“隐藏”起来,

函数声明与函数表达式区别:

  • 看function出现在声明中的位置,如果function是声明中的第一个词,则是函数声明,否则是函数表达式
  • 最重要的区别是他们的名称标识符将会绑定在何处
//函数声明式
function greeting(){
      console.log("hello world");  
}
//函数表达式
var greeting = function(){
    console.log("hello world"); 
}

块作用域

  • with 关键字会创建一个块作用域,用 with 从对象中创建出的作用域仅在 with 声明中而非外部作用域中有效
  • ES3 的 try/catch 的 catch 分局会创建一个块作用域,其声明的变量仅在 catch 内部有效

try(){

   undefined()

}catch(err){

   console.log(err) //能打印出err错误

}

console.log(err)// err not found

但是当同一个作用域中两个或多个 catch 分局,用了同样的标识符声明错误变量,如都用了 catch(err) ,有些静态检查工具会发出警告,但实际上这不是重复定义

  • let 关键字可以将变量绑定到所在的任意作用域中,通常是{...}内部,也就是说 let 相当于为其声明的变量隐式劫持了所在的块作用域.
  • 可以使用块作用域做一些垃圾回收,如上文调用的函数完毕后,可能还在占用内存

function foo(){...}

{

   let bar = {...}

   foo(bar) // 大括号为块级作用域,这里是显示声明作用域

}

  • let 可以将 for 循环中声明的变量绑定到 for 循环的块中,事实上它将其重新绑定到了循环的每一个迭代中,确保使用上一个循环迭代结束时的值重新进行赋值、用 var 声明会造成该变量泄漏到上级作用域中
  • const 同样可以来创建块级作用域变量,但值是固定的(常量)

CON

  • 块级作用域指的是变量和函数不仅可以属于所处的作用域,也可以属于某个代码块(通常为{...}
  • ES3 开始 ,try/catch 的 catch 分局中具有块级作用域
  • ES6 引入的 let 能够隐式劫持作用域

爬。