0

我在返回函数中有一个非常简单的逻辑,但它没有按预期工作。当然我可以让代码稍长一些并解决问题,但我希望它尽可能小。

这是我的代码:

#Return title if exists or false otherwise
getPageTitleFromMainContent = (mainContent) ->
  mainContent.find('#pageTitle') ?.length ?=  false

if y = (getPageTitleFromMainContent $("#mainContent"))
  y.css color:red

如您所见,如果它在#mainContent 中找到#pageTitle,它应该将其变为红色。但是如果找到该函数不会返回#pageTitle,它会返回.length。

从 js2coffee.org 我看到代码被编译成:

var getPageTitleFromMainContent, y;

getPageTitleFromMainContent = function(mainContent) {
  var _ref, _ref1;
  return (_ref = mainContent.find('#pageTitle')) != null ? (_ref1 = _ref.length) != null ? **_ref1 : _ref.length = false : void 0;**
};

if (y = getPageTitleFromMainContent($("#mainContent"))) {
  y.css({
    color: red
  });
}

它应该是_ref : _ref.length = false : void 0;,不是_ref**1** : _ref.length = false : void 0;

http://jsfiddle.net/X8VjJ/1/

谢谢!

4

2 回答 2

3

如果它找到#pageTitlein #mainContent,它应该把它变成红色

您可以使用更简单的方法来完成此操作:

 $('#mainContent #pageTitle').css(color: 'red')

因为,如果在找不到#pageTitle#mainContent它会尝试更改一组空元素的 css——无操作。

您提供的代码实际上没有任何意义。?.是不必要的,因为 jQuery 选择器不会返回null或者undefined不匹配;它将返回一组空元素。所以它总是返回length,它总是一个数字,所以赋值永远不会执行,因为它依赖于length返回nullor undefined。这很好,因为您可能不想将元素的长度设置为false.

最后,这不是三元 if 语句。CoffeeScript 的三元 if 语句如下所示if foo then bar else baz

于 2013-02-21T15:24:48.740 回答
2

不确定代码是否有意义。除非定义了长度,否则您实际上是在尝试分配给长度属性。如果它被定义,它只返回长度属性。看起来代码和行为是正确的,但是您对存在运算符和返回值的理解是错误的。如果您想返回找到的元素,您可能需要将其与长度检查断开连接。

也许是这样的:

getPageTitleFromMainContent = (mainContent) ->
  arr = mainContent.find('#pageTitle')
  if arr.length then arr else false

正如 Ian 在他更优雅的回答中解释的那样,您不需要在 arr 上使用存在运算符(假设为 jquery),因为它始终是一个元素数组(如果未找到,则长度为零)。

于 2013-02-21T15:18:05.577 回答