使用简单函数声明或表达式的最佳方法-箭头函数声明不起作用

时间:2018-12-20 10:24:05

标签: javascript ecmascript-6 arrow-functions function-expression

我创建了一个简单的函数,用于测试是否可以将2个字符串重新排列为相同的字符串-例如:

// tests
canRearrange('teset','testy'); // false
canRearrange('teste','teset'); // true
canRearrange('tes','set'); // true

为简便起见,我正在尝试在else节中确定最好,最简洁和最简洁的编写函数的方法。我尝试了以下方法:

// 1. requires var sameChars being defined first
var sameChars = ((c) => str1.includes(c) && str2.includes(c));
return str1.every(sameChars) && str2.every(sameChars);

// 2. works but is untidy
return str1.every(((c) => str1.includes(c) && str2.includes(c))) && str2.every(((c) => str1.includes(c) && str2.includes(c)));

// 3. fails presumably due to syntax error
return str1.every(sameChars) && str2.every(sameChars);
function sameChars((c) => str1.includes(c) && str2.includes(c));

所以从本质上讲,我正在尝试使#3(以上)工作,或者看看是否有更好的编写方法。如果函数“ sameChars”写在主代码下面,那么它大概仍然可以工作-我的主代码(它可以工作)如下:

function canRearrange(str1,str2) {

    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    } else {
        return str1.every(sameChars) && str2.every(sameChars);
        function sameChars(c){
            return str1.includes(c) && str2.includes(c);
        }
    }
}

有人对如何改善它有任何想法吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

// 3. fails presumably due to syntax error
return str1.every(sameChars) && str2.every(sameChars);
function sameChars((c) => str1.includes(c) && str2.includes(c));

标记为//3. fails presumably due to syntax error的行实际上包含语法错误,如下面的可运行代码段所示。如评论中所指出的,您正在混合function declarationarrow function的格式。箭头函数是function expression的简写语法。函数声明悬挂 1 ,而函数表达式则没有,这就是为什么“主代码”与函数声明一起使用的原因。

function canRearrange(str1,str2) {

    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    } else {
        return str1.every(sameChars) && str2.every(sameChars);
        function sameChars((c) => str1.includes(c) && str2.includes(c));
    }
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

return语句上方定义函数真的重要吗?不会依赖那种方式吊起...

function canRearrange(str1,str2) {
    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    }
    const sameChars = c => str1.includes(c) && str2.includes(c); 
    return str1.every(sameChars) && str2.every(sameChars);
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

如果不能忍受选项一,则可以使用函数声明格式,但可以全部使用一行。有人可能会认为这种方式不太可读。

return str1.every(sameChars) && str2.every(sameChars);
function sameChars(c) { return str1.includes(c) && str2.includes(c)}; 

function canRearrange(str1,str2) {
    str1 = str1.split(''), str2 = str2.split('');

    if (str1.length != str2.length) {
        throw "Bad Input";
    }
    return str1.every(sameChars) && str2.every(sameChars);
    function sameChars(c) { return str1.includes(c) && str2.includes(c)}; 
}
console.log(canRearrange('teset','testy')); // false
console.log(canRearrange('teste','teset')); // true
console.log(canRearrange('tes','set')); // true

1 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Function_declaration_hoisting