二元函数等价 - demethodize

时间:2014-09-05 15:27:50

标签: javascript

我正在观看道格拉斯·克罗克福德的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;

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

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

2 个答案:

答案 0 :(得分:1)

因为call不知道应该调用哪个函数。请查看MDN documentation this的工作原理。

相同
var foo = {bar: function() { console.log(this); }};
foo.bar(); // logs foo
var bar = foo.bar;
bar(); // logs window

您改变了执行.call的方式,并改变了this引用的内容。

答案 1 :(得分:1)

demethodize函数的结果是Function.prototype.call函数 - 未绑定到fn,即没有this value(如果它被称为{{}} {1}})。但是,您可以使用bind method来解决此问题:

fn.call(…)