今天早些时候我注意到了一些奇怪的事情。我似乎无法存储对函数的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。您可以随意使用它,这里,您将得到同样的结果。
那么为什么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。很明显,你永远不会像这样使用代码,我只是好奇。
发布于 2014-06-12 18:49:13
您需要保持绑定到控制台。试试这个:
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/
发布于 2014-06-12 18:53:08
这是我在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!");都是这样的人。
https://stackoverflow.com/questions/24191701
复制相似问题