【发布时间】:2014-06-12 18:42:46
【问题描述】:
我今天早些时候注意到了一些奇怪的事情。我似乎无法存储对函数的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。显然你永远不会真正使用这样的代码,我只是好奇。
【问题讨论】:
-
当您将console.log.call 存储在一个变量中时,它失去了对console.log 的引用,这意味着它不再知道在什么上执行参数。由于这个事实,我希望您的第一个示例在某些浏览器中失败(取决于所使用的浏览器如何定义 console.log)
-
这与
this的工作方式有关:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。由于您“通常”调用函数 (logCall()),this要么指的是window,要么是undefined。Function.prototype.call不知道要作用于哪个函数。 -
是的。这两个示例都不适用于 Chrome
-
FWIW,第一个示例在 Chrome 35 中工作。edit: 嗯,jsBin 可以工作,但是如果我直接在控制台中执行它就不行o_O跨度>
-
“那么为什么 Javascript 会阻止我以这种方式调用 call?” 再次了解
this的工作原理:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。这是一个很常见的问题,有一个简单的解释。
标签: javascript