我正在尝试了解此脚本的工作方式。
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(_)
答案 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
-考虑到您实际上传递了一个命名参数,为什么不仅仅测试!!_
?lodash
或underscore
,否则为什么要命名自变量_
?它甚至是什么意思,代表什么?(1, 2)
表示法,否则会使代码不必要地难以遵循。请改用if
,用一行代码完成所有这些操作有什么好处?