我今天早些时候注意到了一些奇怪的事情。我似乎无法存储对函数的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
?
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
。显然你从来没有真正使用这样的代码,我只是很好奇。
答案 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!");
那是所有人。