gpt4 book ai didi

JavaScript 和柯里化(Currying)

转载 作者:行者123 更新时间:2023-11-29 19:58:15 27 4
gpt4 key购买 nike

我正在阅读 John Resig 的 Secrets of Javascript ninja,并正在尝试其中一个关于柯里化(Currying)和偏函数的示例。代码如下:

<html>
<body>
<button id="test">Click Me!</button>
</body>


<script type="text/javascript">
Function.prototype.curry = function() {
var fn = this,
args = Array.prototype.slice.call(arguments);

return function() {
return fn.apply(this, args.concat(
Array.prototype.slice.call(arguments)));
};
};


var elem = document.getElementById("test");
var bindClick = elem.addEventListener.curry("click");
bindClick(function(){ console.log("OK"); });
</script>
</html>

但是,以下代码似乎会生成错误 Uncaught TypeError: Illegal invocation on the apply function。

我似乎无法弄清楚原因,因为这一切似乎都有道理。bindClick 将返回一个匿名函数,该函数以 window 作为函数上下文调用函数 elem.addEventListener (this)并且参数将是 ["click", function() {console.log("OK"); }]

最佳答案

问题是您丢失了元素的上下文。 addEventListener 方法必须在元素上调用,但您是在函数上调用它:

// Here, `this` refers to a function, not an element
return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));

您需要将元素传递给您的新函数。例如:

Function.prototype.curry = function () {
var fn = this,
args = Array.prototype.slice.call(arguments);

return function (context) {
return fn.apply(
context,
args.concat(Array.prototype.slice.call(arguments, 1))
);
};
};

这是一个 working example .请注意向返回的函数添加了一个 context 参数,还要注意向 slice 调用添加了第二个参数 - 这是删除新的 context 所必需的 参数并且只应用任何后续参数。

关于JavaScript 和柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com