存储对`call`函数的引用

时间:2014-06-12 18:42:47

标签: javascript

我今天早些时候注意到了一些奇怪的事情。我似乎无法存储对函数的call属性的引用,然后执行它。例如:

var log = console.log;
log.call(console, 'This works'); 

var logCall = console.log.call;
logCall(console, 'This does not');

对我来说,这似乎是完全合法的Javascript,但第二次调用总是给我undefined is not a function的错误。随意玩它here,你会得到相同的结果。

那么为什么Javascript会阻止我以这种方式调用call

编辑:在阅读SimpleJ的回答之后,我终于在脑海里直截了当。因此,我将更新以了解如何使上述工作:

var log = console.log;
log.call(console, 'This works'); 

var logCall = console.log.call;
logCall.call(console.log, console, 'This works now too');

问题是console.log收到了正确的this值,但console.log.call没有给出正确的this值。所以你可以看到,我基本上必须执行console.log.call.call。显然你从来没有真正使用这样的代码,我只是很好奇。

2 个答案:

答案 0 :(得分:3)

您需要保持绑定到控制台。试试这个:

var logCall = console.log.call.bind(console.log);
// example: logCall(console, "foobar");

var log = console.log.bind(console);
// example: log("foobar");

对于log的绑定引用。

编辑: jsfiddle:http://jsfiddle.net/67mfQ/2/

答案 1 :(得分:2)

这是我在JavaScript中最喜欢的代码:

var bind = Function.bind;
var call = Function.call;

var bindable = bind.bind(bind);
var callable = bindable(call);

您可以使用bindable功能获取对f.bind的引用。同样,您可以使用callable函数获取对f.call的引用,如下所示:

var log = callable(console.log, console);

现在你需要做的就是像任何其他函数一样调用log函数:

log("Hello World!");

那是所有人。