使用匿名函数索引 JavaScript 会出现错误:“未定义”

时间:2021-06-06 05:27:52

标签: javascript function

我的问题是检索“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;
        }
    }

它奏效了。但是当我尝试使用匿名函数减少行数时,我无法执行我的函数。我知道我有一个愚蠢的错误,因为我是编程新手。我的代码有什么问题? 像这样:

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

谢谢!

4 个答案:

答案 0 :(得分:0)

这是因为在您的原始代码中您正在执行 findIndex(),但在您的第二个代码中,您只是将匿名函数本身用作索引,而不是执行它。

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"));

答案 1 :(得分:0)

在您的情况下,您只编写函数定义。要运行需要添加 () 的函数。所以只需在定义后添加 () 即可。

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'));

答案 2 :(得分:0)

在第一个示例中,您调用了 findIndex 方法,但在第二个示例中,您只是定义了 function,而没有调用它。

您必须找到解决方案来修复它:

  1. 使用IIFE立即调用的函数表达式):

您定义和调用方法的位置,例如您在此处尝试执行的操作,请检查 documentation

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'))

答案 3 :(得分:0)

你只是传递了函数的引用,你并没有执行它。您可以在函数结束后立即添加 () 以这样运行它:

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 say

<块引用>

任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员会编写人类可以理解的代码。