对javascript中的`return`语句感到困惑。需要说明

时间:2016-11-16 14:48:31

标签: javascript

我不久前在不久前发布了一个关于我试图解决的kata的问题。在那个问题中,(如果感兴趣The documentation这里找到)我需要在我的函数中添加return语句,这样我就可以避免以下错误Value is not what was expected

现在我的第二次迭代我的kata解决方案试用了,这里是:

function isMerge(s, part1, part2) {
  var pointer = 0
  splitString = s.split('');
  splitString.forEach(function(character) {
    if (part1.includes(character) || part2.includes(character)) {
      pointer++;
      return true;
    } else { 
      return false;
    }
  });
}

isMerge('codewars','cdw','oears')

当我尝试执行代码时,我仍然遇到Value is not what was expected错误,这次我很困惑为什么会发生这种情况。

对于初学者,取自MDN指南

  

return语句结束函数执行并指定要返回给函数调用者的值。

     

表达   要返回的表达式。如果省略,则返回undefined。

查看我的if/else逻辑我在return true循环中指定了return falseforEach条件,以查看来自part1和{的所有字符{1}}在字符串中。我要回信了,为什么我有part2

其次,根据Value is not what was expected语句的定义,该函数应该在到达该关键字时停止。但是,当我在逻辑中放置return时,我可以在我的控制台上看到正在输出所有字符,因此在执行console.log(character)时函数根本不会中断。这是为什么?

第三,我很困惑何时一般使用return true关键字。请考虑return的MDN文档中的这些示例。

示例1:

ForEach

示例2:

function logArrayElements(element, index, array) {
  console.log('a[' + index + '] = ' + element);
}

// Notice that index 2 is skipped since there is no item at
// that position in the array.
[2, 5, , 9].forEach(logArrayElements);
// logs:
// a[0] = 2
// a[1] = 5
// a[3] = 9

这些示例中没有一个function Counter() { this.sum = 0; this.count = 0; } Counter.prototype.add = function(array) { array.forEach(function(entry) { this.sum += entry; ++this.count; }, this); // ^---- Note }; var obj = new Counter(); obj.add([2, 5, 9]); obj.count // 3 obj.sum // 16 语句。

现在看看这个return示例。

.every

最后,根据我之前的问题,我需要添加这样的第二个function isBigEnough(element, index, array) { return element >= 10; } [12, 5, 8, 130, 44].every(isBigEnough); 语句以避免值错误。

return

所以.......总之,对于我的原始函数启动了这个,当我到达function isBigEnough(element, index, array) { return element >= 10; } function whenToUseReturn(array) { return array.every(isBigEnough); } whenToUseReturn([12, 5, 8, 130, 44]); 时我应该退出循环并返回它同样当所有字符都在字符串中时,如何返回'累积'为真并避免出现值错误。我希望这是有道理的,我可以通过编辑来澄清,以更好地说明我的观点。

2 个答案:

答案 0 :(得分:1)

我的朋友,因为你决定采用"回调方式"使用.each等,你应该考虑使用回调,因为在这种情况下你不能返回任何东西。如果您不希望采用回调方式,只需使用标准的javascript,例如:

can_apply

替换为

splitString.forEach(function(character) {

现在你可以回来了。使用"每个"只需要循环一个数组,就可以防止你返回。

答案 1 :(得分:1)

  

我要回信了,为什么我的价值不符合预期?

return语句从您从forEach传递到isMerge而不是的回调中返回。 return语句不跨越函数边界。 isMerge不包含return语句,因此返回undefined。如果我们稍微重写函数,它可能会变得更清晰:

function doSomething(part1, part2) {
  return function(character) {
    if (part1.includes(character) || part2.includes(character)) {
      return true;
    } else { 
      return false;
    }
  }
}

function isMerge(s, part1, part2) {
  splitString = s.split('');
  splitString.forEach(doSomething(part1, part2));
}

isMerge('codewars','cdw','oears')

这相当于您的代码。如您所见,return中没有isMerge语句。

  

在这些示例中没有一个返回语句。

return示例中没有forEach个语句,因为forEach 对回调的返回值没有任何作用,所以没有返回任何东西。

forEach只是迭代数组的一种不同方式,但它不会产生reduceevery之类的值。

  

当我达到false并且返回它时我应该如何退出循环,同样当所有字符都在字符串中时,如何返回'cumulative'true并避免Value错误。

您无法退出forEach“循环”。如果您必须提前停止迭代,则需要使用正常的forfor/infor/of)循环。

要返回并生成值,您可以使用使用every的原始解决方案。