此Javascript代码中发生了什么?

时间:2019-07-09 09:06:58

标签: javascript syntax

我正在尝试了解此脚本的工作方式。

  object.variable = function(_) {
    return arguments.length ? (variable = functor(_), object) : variable;
  };

很明显,它用于允许覆盖variable上的默认object值,但是这段代码有什么问题:

  object.variable = function(_) {
    return arguments.length ? variable = _ : variable;
  };

已找到函子函数:

function functor(d) {
  return typeof d === "function" ? d : function() { return d; };
}

我可以看到,这确保了将传入的任何内容都视为一个函数。

那么,为什么不使用Java (variable = functor(_), object)这个构造,我不明白它是如何工作的呢?为什么不只是variable = functor(_)

3 个答案:

答案 0 :(得分:2)

如您所见,区别在于返回对象:

object.variable = function(_) {
    return arguments.length ? (variable = functor(_), object) : variable;
};

可以这样写:

object.variable = function(_) {

    if (arguments.length) {
        variable = functor(_);
        return object;
    } else {
        return variable;
    }
};

object.variable = function(_) {
    return arguments.length ? variable = _ : variable;
};

可以这样写:

object.variable = function(_) {
    if (arguments.length) {
        variable = _;
    } else {
        return variable;
    }
};

答案 1 :(得分:2)

  

那么,为什么不使用Java (variable = functor(_), object)这个构造,我不明白它是如何工作的呢?为什么不只是variable = functor(_)

此方法的作者基本上是使用comma-operator来调用functor(...)并最终返回object

comma-operator执行用逗号分隔的表达式,因此最新的表达式将是其执行的结果。

看看这个:

let result = (1,2,3,4,5 === 5);
console.log(result); // Here will be printed true because 5 === 5 was the last expression.

答案 2 :(得分:0)

var variable = (f(1), f(2));

导致f(1)f(2)被依次执行(如上所述,comma operator),其中variable被赋予f(2)的值。因此,如果提供了参数,第一个示例将为functor(_)分配variable并返回object。如果没有参数,则什么也不会发生,并且将返回variable

指出此代码充满反模式非常重要,除非它是某些学校任务的一部分,否则应将其重构,否则会造成混淆。例如:

  • 永远不要在同一表达式中分配和返回值
  • 除非functor是适当的名称(函数名称应具有描述性),否则您不应调用函数functor
  • 除非绝对必要,否则不应该检查arguments-考虑到您实际上传递了一个命名参数,为什么不仅仅测试!!_
  • 除非使用lodashunderscore,否则为什么要命名自变量_?它甚至是什么意思,代表什么?
  • 除非绝对必要,否则应避免使用(1, 2)表示法,否则会使代码不必要地难以遵循。请改用if,用一行代码完成所有这些操作有什么好处?