JavaScript函数上下文不正确

JavaScript函数上下文不正确,javascript,Javascript,我注意到javascript中有一个奇怪的东西。考虑下面的内容: var fn = ''.toUpperCase.call console.log(typeof fn); // "function" fn(); // Uncaught TypeError: `fn` is not a function 以上是在我的Chrome开发者控制台上执行的。版本为43.0.2357.81 m typeof操作符清楚地表明fn是一个函数,但错误表明并非如此 我注意到Function.apply至少显示了一

我注意到javascript中有一个奇怪的东西。考虑下面的内容:

var fn = ''.toUpperCase.call
console.log(typeof fn); // "function"
fn(); // Uncaught TypeError: `fn` is not a function
以上是在我的Chrome开发者控制台上执行的。版本为
43.0.2357.81 m

typeof
操作符清楚地表明
fn
是一个函数,但错误表明并非如此

我注意到
Function.apply
至少显示了一些有意义的错误消息


那么,什么时候是函数而不是函数?

Javascript中的上下文总是通过调用函数的方式建立的

var fn = ''.toUpperCase.call
这将
调用
函数的原型实现分配给
fn
。如果现在调用
fn()
,则调用没有上下文<代码>调用将尝试调用与其关联的函数对象。但是,该上下文是在调用时建立的。因为您在调用时没有给它任何上下文,所以
call
的某个内部组件抛出了一个错误

你必须这样做:

fn.call(''.toUpperCase)
没错,您可以
调用
调用
函数,建立一个上下文,即
toUpperCase
字符串函数。在这种特定情况下,这将导致
toUpperCase
中的另一个错误,因为它未绑定到特定上下文。您还需要明确地建立该上下文:

var fn = ''.toUpperCase.call
fn.call(''.toUpperCase.bind(''))
也看到

那么,什么时候是函数,不是函数

该函数是一个函数,但您没有正确执行它,正如@deceze在注释和答案中所解释的那样

我注意到javascript中有一个奇怪的东西

您似乎被您在测试环境中得到的消息弄糊涂了,该消息并不完全正确

未捕获类型错误:
fn
不是函数

当前稳定的chrome版本(在我安装的linux上为40.0.2214.91,chrome无法在我的硬件上运行而不进行设置更改),chrome作为您测试的环境,提供了一条看起来更正确、更有意义的错误消息

Uncaught TypeError: undefined is not a function
那么,你是在问/想问一个严肃的问题,还是只是在嘲笑chrome版本中的一个错误?

是正确的,我只是想从不同的角度解释一下

您的
fn
是对
函数.prototype.call
的引用,需要使用函数作为其
引用进行调用,在这种情况下,
调用的上下文是
字符串.prototype.toUpperCase
,它是通过
'.toUpperCase
继承的

除此之外,
String.prototype.toUpperCase
还必须使用特定上下文调用,即字符串到大写

这里有另一种编写您想要的代码的方法,可以帮助您了解正在发生的事情

var str='aaa';
var上限=''.toUpperCase;
var fn=上限调用;
//现在我们必须为upper和fn指定上下文

console.log(fn.call(function(){return upper.call(str)}));//AAA
请显示您调用
fn
的确切方式。我得到
未定义不是函数
当调用
fn
时,不是
fn不是函数
。确定。尽管如此,请给出一个完整的示例,说明什么代码产生了什么错误。请澄清Consele是否为打字错误,如果notFirebug有更深刻的错误消息,请进行编辑:
TypeError:Function.prototype.call调用了不兼容的未定义的
。基本上,
call()
需要对一个对象(
this
)进行调用,这个对象丢失了,在原始语句之外被调用。那么你认为,这个链接问题的答案也是吗?@Amit是的,你基本上是在说同样的话。
Javascript中的上下文总是通过调用函数的方式建立的。
除非它是一个箭头函数,或者函数已经绑定。
40.0.2214.91
不是Chrome的当前稳定版本。您从中获取Chrome的软件包源不是最新的。另外,我只想指出一点(即使OP在提问之前知道这个问题的答案),想要创建一个关于这个非常令人困惑的错误的信息库与“戳戳乐趣”相去甚远。我还有很多其他工作要做,而不是在chrome上戳戳一点乐趣。仅供参考,我在回答时遇到了这些东西,并不是每个人都使用你使用的chrome版本(我不会手动更新chrome,它会自动更新),谢谢你的回答。谢谢你在我上面的评论。在Fedora 19上,它是40.0.2214.91,它会使用软件包存储库中的YUM自动更新,我不打算自己构建它(我只记得这是chrome而不是chrome)。我知道不同的操作系统有不同的稳定版本,肯定会有差异。好的,你的问题中没有包含这些信息,所以你真的试图检查你是否正确回答了另一个问题?或者我仍然不明白这个问题是什么,或者你希望得到什么样的答案?developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call