gpt4 book ai didi

javascript - 二元函数等价 - demethodize

转载 作者:行者123 更新时间:2023-12-02 17:01:14 24 4
gpt4 key购买 nike

我正在观看 Douglas Crockford 的 Pluralsight 视频:http://pluralsight.com/training/Courses/TableOfContents/javascript-good-parts

在这段视频中,他通过一些有趣的练习来演示一些 JavaScript 原理。当他到达“demethodize”函数时,您基本上会得到以下代码示例:

function add(x,y){
return x + y;
}
//add(1,2) => 3

function methodize(fn){
return function(x){
return fn(this, x);
};
};
Number.prototype.Add = methodize(add);
//(1).Add(2) => 3

function demethodize (fn){
return function(x,y){
return fn.call(x,y);
};
}
var newAdd = demethodize(Number.prototype.Add);
// newAdd(1,2) => 3

请注意,此“demethodize”函数仅适用于二进制函数。

我的问题是,根据我的理解,以下内容应该产生等效的“demethodise”函数:

function demethodize (fn){
return fn.call;
}

var demethodize = Number.prototype.Add.call;

但是这些函数不起作用(给定相同的二进制函数要求)!这是为什么?

请帮助我填补我理解上的空白。我曾想过,如果我有一个二进制函数,其实现包含另一个二进制函数调用,并将相同的参数传递给内部函数,那么直接使用内部函数调用将是等效的。

最佳答案

demethodize 函数的结果是 Function.prototype.call 函数 - 未绑定(bind)到您的 fn,即没有 this value (如果它被称为fn.call(…))。不过,您可以使用 bind method 来修复该问题:

function demethodize(fn) {
return Function.prototype.call.bind(fn);
}
// or long:
function demethodize(fn) {
return function(context/*, args... */) {
var args = Array.prototype.slice.call(arguments, 1);
return fn.apply(context, args);
// equivalent (for binary functions) to
return fn.call(context, args[0]);
// ^^^^^^ is a method invocation here
};
}

关于javascript - 二元函数等价 - demethodize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25689265/

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