2020年1月13日 星期一

JS學習:函數進階使用技巧


代理函數物件

根據不同的條件,代理函數物件可以指向不同的函數來實現動態改變,如下:

function femaleFunction() {
    console.log('female');
}

function maleFunction() {
    console.log('male');
} 

let sex = 'female';

let sexFunction = sex === 'female' ? femalFunction : maleFunction;

sexFunction();    // female


上方倒數第二行的語句與下方相等,只是使用更為簡短的方式
if(sex === 'female') {
    sexFunction = femaleFunction;
}else {
    sexFunction = maleFunction;
}


函數執行佇列

針對某一個物件,可以根據不同的情況進行一系列的操作,如下:

function aFunc(obj) {
    console.log('aFunc');
    obj.aFunc = true;
}

function bFunc(obj) {
    console.log('bFunc');
    obj.bFunc = true;
}

function cFunc(obj) {
    console.log('bFunc');
    obj.cFunc = true;
}

let obj = {};

let functionAry = [];

functionAry.push(aFunc);
functionAry.push(bFunc);
functionAry.push(cFunc);

for( let i = 0 ; i < functionAry.length ;  i++) {
    functionAry[i](obj);
}

console.log(JSON.stringify(obj));  

// aFunc
// bFunc
// cFunc
// {"aFunc":true,"bFunc":true,"cFunc":true}


由上述的輸出結果可以得知函數依照 a 、 b 、 c 的順序執行,並且確實為 obj 物件增加了三個屬性,當然也可以有更多的變化,像是透過額外的陣列來儲存調用順序、動態控制參數等等

使用參數返回函數

有一個物件,我們希望依據該物件的內容或是型別來決定要使用什麼函數,傳統的方法可以在函數內部再調用其他函數,但是這樣會略顯冗長,如果使用函數來返回函數會比較簡潔,如下:

function chooseFunc(params) {
    // 利用型別來決定返回函數
    if(typeof params !== 'string'){
        return objFunction;
    }

    // 根據內容來決定返回函數
    switch(params) {
        case "A":
            return aFunc;

        case "B":
            return bFunc;

        default:
            return defaultFunc;
    }
}

函數動態添加實例屬性

假設有一個射擊函數,如果想知道總共射擊了幾次的話,可以在射擊函數裡面加上一個動態屬性次數,如果要引用的話,需要使用「函數名稱 + 屬性名稱」來存取,如下:

let shot = function(){
    shot.times ++;
    console.log(shot.times);
};

shot.times = 0;

shot();  // 1
shot();  // 2
shot();  // 3


函數物件動態添加實例方法

除了可以添加屬性之外,當然也可以添加方法,延續上面的例子,現在每射擊三次就要裝填彈藥一次,如下:

let shot = function(){
    shot.times ++;
    console.log(shot.times);
    shot.reload();
};

shot.reload = function() {
    if(this.times >= 3){
        this.times = 0;
    }
};

shot.times = 0;

shot();  // 1
shot();  // 2
shot();  // 3
shot();  // 1
shot();  // 2


由上方的例子可以知道函數是極其靈活的,但是也因為他的靈活性,在大專案使用更需要注意

沒有留言:

張貼留言

JS學習:函數進階使用技巧

代理函數物件 根據不同的條件,代理函數物件可以指向不同的函數來實現動態改變,如下: function femaleFunction() { console.log('female'); } function maleFunction() { ...