跳到主要內容

Javascript:宣告函數的方式



許多傳統的程式語言中,宣告一個函數,通常僅能藉由關鍵字如:private void Click(){....}來聲明並使用,但如果需要將函數作為參數傳給另一個函數,或者賦予給本地變數,甚至是作為一個返回值,是需要藉由pointer、delegate等特殊方式來達成,且較為複雜。
但在Javascript中就不一樣了,不但具有傳統函數的特點,也可以做到像變數一樣,作為參數的傳遞、變數的賦值、返回值等,甚至還可以作為"類"構造函數的作用,因此各種使用方式都有其優缺點在,需要加以了解後才能正確地使用,就以宣告方式來說,就有以下四種常見的宣告方式。

    ●函數宣告:function declaration(){...}
    ●函數運算式-匿名函數:var functionExpression = function(){....}
    ●函數運算式-具名函數:var namedFunctionExpression = function named(){....}
    ●Function類:var functionConstructor = new Function(...)

這些是常看到用來宣告函數的方法,但其中有些差異。
     一、函數宣告(Function Declaration)


function fn(){
     //content
}
使用這樣的方式來宣告函數,則同一個作用域內皆可訪問,不論宣告在調用之前或是調用之後,而這是因為在javascript執行前就被建立起來,而非動態產生,且藉由hoisting機制讓其提升到作用域最前面,即使寫代碼的時候在最後面也會被提升至最前面,在該領域的任何地方皆可存取,除此之外這種函數宣告方式又為具名函數,名稱為fn,採具名函數對於Debug是非常有幫助的。
fn();//doSomething
function fn(){
     console.log('doSomething');
}
fn();//doSomething
由於屬於靜態的關係,故缺點在於無法根據條件的判斷來決定function的內容。
 var flag = false;
    function fn1(){
        console.log('fn1')
    }
    if (flag) {
        function fn1(){
            console.log('fn1 and flag = true');
        }
    }
    fn1();
原本預期結果因flag = false故條件不成立,會是印出fn1,但實際結果卻是fn1 and flag = true,因此無法根據條件的判斷來決定function內容。

       二、函數運算式(Function Expressions)

可以宣告一個變數來動態產生一個function,但須注意的是在執行期間才被建立起來,因此在調用時得確保是否在調用之前就宣告,否則會發生「undefined is not a function」的錯誤,由於是動態產生,所以必須先產生才能調用。
fn();//undefined is not a function
var fn = function(){
     console.log('doSomething');
}
fn();//doSomething
這種宣告方式屬於動態宣告,故我們可以加入判斷來決定該function的內容,故可以得知結果為「fn1 and flag = true」。
   var flag = true;
   var fn1 = function(){
       console.log('fn1');
   };
    if (flag) {
        fn1 = function (){
            console.log('fn1 and flag = true');
        };
    }else{
        fn1 = function (){
            console.log('fn1 and flag = false');
        };
    }
    fn1();

      三、具名函數運算式(named function expressions,簡稱 NFE)

上面的宣告方式都是屬於匿名宣告,若想採用具名宣告可參考如下,對於Debug時較有幫助,且假設在function內又要呼叫自己的話可以採取具名方式,這樣一來可讀性較佳。

var result = function Fibonacci(n){
        return n === 1 ? n : n + Fibonacci(n - 1);
};
alert(Fibonacci(100))//這個變數在函數之外是看不到的
alert(result(100)); //1+...+100=5050

      四、函數關鍵字(Function Keyword)

直接使用Function關鍵字來建立函數物件,也就是使用new與建構子來建立函數,且不會建立任何的closure,在這個函數中只能存取全域的變數與該函數內部的變數,此外,每一次的執行都會進行parse的動作故效率較差。
var add = new Function('a','b','return a + b;')
console.log(add(5+3))//8
可以發現參數都是字串,這種建立方式充滿了危險性,尤其是如果參數來自使用者的輸入情況下更加危險。

留言

這個網誌中的熱門文章

java西元民國轉換_各種不同格式

C#資料庫操作(新增、修改、刪除、查詢)

【Excel好好玩】 自己的資產自己管!善用Google Sheet來幫我們評估貸款

這次介紹的主題是關於Excel的貸款還款計畫試算,我們人生中總會遇到需要大筆金額的花費,但當資金不夠時就得進行貸款,而貸款之前如果我們能夠審慎評估,並分析自己的還款能力之後在進行凍作,相信風險會小很多,因此就自己動動手來使用Google Sheet進行試算吧! 基本資料 ● 貸款總額: 1000000 ● 貸款期數: 84月 ● 年利率: 2.11% ● 月利率: 0.18% P.S 月利率 = 年利率 / 12 重要函式 PMT : 這是Google Sheet內建的重要年金計算公式,我們可以善用這個公式來計算固定利率及期數的固定攤還本息。因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 動手做 首先我們在Excel表上列出我們的基本資料 圖片來源 其中月利率的部分就使用公式「=B4/12」 接著我們填上第一列的期數跟餘額 圖片來源 =B2 =B3 使用關鍵PMT函數來計算本息的部分 因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 -PMT(貸款利率(月利率), 貸款期數, 貸款總額) =-PMT($B$5,$B$3,$B$2) 圖片來源 計算利息 利息 = 貸款餘額 x 月利率 =B8*$B$5 圖片來源 計算本金 本金 = 本息 - 利息 =C8-D8 圖片來源 製作第二列餘額的部分 餘額的部分 = 上一期的餘額 - 上一期的本金 圖片來源 接著拖曳該兩列往下拉,即可查看每一期的利息與本金 圖片來源 結語 雖然市面上已經有很多貸款銀行都提供了試算功能,但如果我們想要進一步管理自己的資產時,就需要將每一期的金額給計算出來,因此才會將公式運用在Excel表,讓我們的資產管理表能夠結合負債,進一步評估我們理財行動的下一步,希望這樣的經驗可以幫助到正在理財道路上打拼的夥伴,讓我們透過有效的管理,幫助荷包長大吧! 喜歡撰寫文章的你,不妨來了解一下: Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!