函數作用域
每聲明一個函數都會為其自身創建一個作用域,屬于這個函數的全部變量都可以在整個函數的范圍內使用及復用。
最小特權原則:最小限度地暴露必要內容,而將其他內容都“隱藏”起來
模塊化封裝
減少全部變量使用,私有化函數方法和變量
inner函數和變量b都私有化到了fun函數內部,外部無法訪問
function fun(a) {
function inner(a) {
return a - 1;
}
var b;
b = a + inner( a * 2 );
console.log( b * 3 );
}
fun( 2 ); // 15
避免同名標識符之間的沖突
函數bar內部的變量i被定位為foo作用域的全局變量,間接修改了定義for循環中的計數變量,導致死循環
function foo() {
function bar(a) {
i = 3; // 修改 for 循環所屬作用域中的 i
console.log( a + i );
}
for (var i=0; i<10; i++) {
bar( i * 2 ); // 糟糕,無限循環了!
}
}
foo();
包裝函數
( function foo(){
console.log(foo)//foo函數
})();
console.log(foo)//foo is not defined
函數表達式: var f1= function() {}
函數聲明: function f2() {}
函數聲明和函數表達式之間最重要的區別是它們的名稱標識符將會綁定在何處
(function foo(){ .. }) 作為函數表達式意味著 foo 只能在 .. 所代表的位置中被訪問,外部作用域則不行。 foo 變量名被隱藏在自身中意味著不會非必要地污染外部作用域。
匿名和具名
匿名函數表達式
function(){....}沒有名稱標識符