我是咖喱功能的新手,有人建议我使用它们。我想知道这个:
var updateNodeStorage;
updateNodeStorage = function(devicesToCheck) {
var nodesToCallOut;
nodesToCallOut = devicesToCheck.filter(function(device) {
var nodeExistInStorage;
return nodeExistInStorage = nodeStorage.devices.every(function(nodeInStorage) {
return device.id !== nodeInStorage.id;
});
});
nodesToCallOut.forEach(function(node) {
getNodeProtocol(node.id);
});
};
为此代码使用咖喱功能是否有益?如果是这样,我将在何处以及如何使用它?
答案 0 :(得分:6)
不,我不会在任何地方看到代码curry会有用。
Currying是预先填充一个或多个函数参数的实践(有时称为"部分应用"函数),以便稍后当curry函数是调用,这些参数传递给原始。这是一个例子:
// A boring function
function foo(a, b) {
snippet.log("a = " + a + ", b = " + b);
}
// Create one curried with the value 1 for a using Function#bind
var curriedFoo1 = foo.bind(null, 1);
// Call it
curriedFoo1(2); // "a = 1, b = 2"

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
正如您在上面所看到的,JavaScript的Function#bind
可以用于咖喱,但是还有一个问题,即它还会将用作this
的值设置为(这就是为什么上面传递null
作为bind
的第一个参数。 JavaScript并没有内置的只是 curry的方法而不会弄乱this
,尽管它很容易添加一个。{1}}。 (例如,PrototypeJS为函数添加Function#curry
。)
这是一个未经优化的纯curry
:
if (!Function.prototype.curry) {
(function() {
var slice = Array.prototype.slice;
Function.prototype.curry = function() {
var curriedArgs = slice.call(arguments);
var original = this;
return function() {
return original.apply(this, curriedArgs.concat(slice.call(arguments)));
};
};
})();
}
if (!Function.prototype.curry) {
(function() {
var slice = Array.prototype.slice;
Function.prototype.curry = function() {
var curriedArgs = slice.call(arguments);
var original = this;
return function() {
return original.apply(this, curriedArgs.concat(slice.call(arguments)));
};
};
})();
}
function foo(a, b) {
snippet.log("a = " + a + ", b = " + b);
}
var curriedFoo1 = foo.curry(1);
curriedFoo1(2); // "a = 1, b = 2"
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;