我正在观看道格拉斯·克罗克福德的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;
但是这些功能不起作用(给定相同的二进制函数要求)! 这是为什么?
请帮助我填补我的理解空白。 我原以为如果我有一个二进制函数,其实现包含另一个二进制函数调用,并且相同的参数传递给内部函数,那么直接使用内部函数调用将是等效的。
答案 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(…)