Javascript咖喱功能有益于此代码?

时间:2014-12-12 14:28:42

标签: javascript currying

我是咖喱功能的新手,有人建议我使用它们。我想知道这个:

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);
  });
};

为此代码使用咖喱功能是否有益?如果是这样,我将在何处以及如何使用它?

1 个答案:

答案 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;
&#13;
&#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)));
            };
        };
    })();
}

&#13;
&#13;
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;
&#13;
&#13;