簡體   English   中英

使用匿名 function 索引 JavaScript 會給出錯誤:“未定義”

[英]Indexing JavaScript with anonymous function gives an error: "Undefined"

我的問題是檢索'A','B','C'或'D',如果我傳遞的字符串s的第一個字母屬於{a,e,i,o,u}或{b,c, d,f,g} 或 {h,j,k,l,m} 或其他剩余的,分別。 我試圖達到這樣的效果:

function getLetter(s){
        let letter = 'ABCD'[findIndex(s[0])];
        return letter;
    }
function findIndex(t){
        var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(t)/5);
        //console.log(a);
        if (a<3){
            return a;
        }
        else{
            return 3;
        }
    }

它奏效了。 但是當我嘗試使用匿名 function 減少行數時,我無法執行我的 function。 我知道我有一個愚蠢的錯誤,因為我是編程新手。 我的代碼有什么問題? 像這樣:

let getLetter = s =>'ABCD'[function(){
        var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(s[0])/5);
        console.log("anonymous function executed");
        if (a<3){
            return a;
        }
        else{
            return 3;
        }
    }]
My output is: undefined

謝謝!

這是因為在您的原始代碼中您正在執行findIndex() ,但在您的第二個代碼中您只是使用匿名 function 本身作為索引,您沒有執行它。

 let getLetter = s =>'ABCD'[function(){ var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(s[0])/5); console.log("anonymous function executed"); if (a<3){ return a; } else{ return 3; } }()] console.log(getLetter("a"));

在您的情況下,您只需編寫 function 定義。 要運行 function,您需要添加 ()。 所以只需在定義后添加()。

 let getLetter = s =>'ABCD'[function(){ var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(s[0])/5); console.log("anonymous function executed"); if (a<3){ return a; } else{ return 3; } }()]; console.log(getLetter('a'));

在第一個示例中,您調用了findIndex方法,但在第二個示例中,您只是定義了function ,而沒有調用它。

你必須解決它:

  1. 使用IIFE立即調用 Function 表達式):

您在哪里定義和調用您的方法,例如您在此處嘗試執行的操作,請查看文檔

 let getLetter = s =>'ABCD'[(function(){ var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(s[0])/5); console.log("anonymous function executed"); if (a<3){ return a; } else{ return 3; } })()]; console.log(getLetter('e'))

  1. findIndex定義為單獨的function

這使您的代碼更清晰。

 let getLetter = s =>'ABCD'[_findIndex(s)]; let _findIndex = letter => { var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(letter[0])/5); console.log("anonymous function executed"); if (a<3){ return a; } else{ return 3; } }; console.log(getLetter('e'))

你只是傳遞了 function 的引用,你沒有執行它。 您可以在 function 結束后立即添加()以像這樣運行它:

 let getLetter = s =>'ABCD'[function(){ var a = Number.parseInt("aeioubcdfghjklmnpqrstvwxyz".indexOf(s[0])/5); console.log("anonymous function executed"); if (a<3){ return a; } else{ return 3; } }()] console.log(getLetter('test'));

但我強烈建議不要這樣做,因為隨着時間的推移,它會更難閱讀、理解、維護和開發。 比減少代碼行更重要的是它是人類可讀的,就像Martin Fowler說的那樣

任何傻瓜都可以編寫計算機可以理解的代碼。 優秀的程序員編寫人類可以理解的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM