区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位
置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中
的第一个词,那么就是一个函数声明,否则就是一个函数表达式。
var a = 2;
(function foo() {
var a = 3;
console.log( a ); // 3
})();
console.log( a ); // 2
由于函数被包含在一对 ( ) 括号内部,因此成为了一个表达式,通过在末尾加上另外一个
( ) 可以立即执行这个函数,比如 (function foo(){ … })()。第一个 ( ) 将函数变成表
达式,第二个 ( ) 执行了这个函数。
这种模式很常见,几年前社区给它规定了一个术语:IIFE,代表立即执行函数表达式
(Immediately Invoked Function Expression);
相较于传统的 IIFE 形式,很多人都更喜欢另一个改进的形式:(function(){ … }())。仔
细观察其中的区别。第一种形式中函数表达式被包含在 ( ) 中,然后在后面用另一个 () 括
号来调用。第二种形式中用来调用的 () 括号被移进了用来包装的 ( ) 括号中。
函数作用域是js中最常见的作用域单元,声明一个函数时,它里面的变量和函数会在当前作用域“隐藏”起来;
块级作用域是指变量或函数不仅属于当前作用域,还属于某个代码块 { } let const try/catch