/* 來源具體可查看《JavaScript模式》 */
一、函數特點
1、函數時第一類對象
- 函數在運行時動態創建,還可以在程序執行過程中創建
- 函數可以分配給變量,可以將它們的引用複製到其他變量,可以被擴展,此外,除少數情況外,函數還可以刪除
- 可以作爲參數傳遞給其他函數,並且還可以由其他函數返回
- 函數可以有自己的屬性和方法
2、函數提供了作用域
在函數內部以var
關鍵字定義的任何變量都是局部變量,對於外部函數是不可見的。(需注意對於if和for來說,並不意味着也是局部變量)
二、函數的定義
1、命名函數表達式
var add=function add(a,b) {
return a + b;
};
2、函數表達式,又稱匿名表達式
var add=function (a,b) {
return a + b;
};
3、函數聲明
function add(a,b) {
return a + b;
}
三、函數的提升
函數聲明與命名函數表達式或者匿名函數的區別在於提升行爲。
函數聲明被提升到了函數頂部(a函數整體),而表達式b,僅提升了var b;
可參考 函數的預解析和逐行解讀
function test() {
console.log(typeof a); //function
console.log(typeof b); //undefind
a(); //'我被彈出'
b(); //' b is not a function '
function a() {
alert('我被彈出');
}
var b=function () {
alert('我沒有彈出')
}
}
test();
四、函數相關的模式
1、回調模式。
函數都是對象,因此它們可以作爲參數傳遞給其他函數。
function getResult() {
//獲取到一些值
}
function doSth(callback) {
callback();
//do something
}
doSth(getResult)
2、返回函數
var steup = function () {
var count = 0;
return function () {
return (count += 1)
};
};
var next=steup();
next(); //1
next(); //2
next(); //3
steup()包裝了返回函數,創建了一個閉包,可以使用這個閉包存儲一些私有數據,而這些數據僅可被該返回函數訪問,但外部代碼無法訪問。
3、自定義函數(惰性函數)
函數可以動態定義,也可以分配給變量。
var scareMe = function () {
alert('逗');
scareMe=function () {
alert('逗b歡樂多')
};
};
scareMe(); //'逗'
scareMe(); //'逗b歡樂多'
scareMe(); //'逗b歡樂多'
scareMe(); //'逗b歡樂多'
scareMe(); //'逗b歡樂多'
當函數有一些初始化準備工作要做,並且僅需要執行一次,這種模式函數很有用的。
4、即時函數(自調用)
語法:
(function () {
alert('hello');
}());
(function () {
alert('hello');
})();
即時函數的返回值
1、具體的值
var result=(function () {
return 2+2;
}())
2、任意的值
var result=(function () {
var res= ?; //獲取需要的值;
return function () {
return res;
};
}())
優點:
定義的所有這些變量將會是用於自調用函數的局部變量,並且不用擔心全局空間被臨時變量所污染。
/待完善/