deceze的回答是正确的,我只是想从不同的角度解释一下。
你fn
是一个引用Function.prototype.call
,需要用一个函数作为它的this
引用来调用它,在这种情况下,call
是 is的上下文String.prototype.toUpperCase
,它是通过继承''.toUpperCase
最重要的是,String.prototype.toUpperCase
还必须使用特定的上下文调用,将字符串转换为大写。
这是另一种编写您想要的代码的方法,可以帮助您了解正在发生的事情。
var str = 'aaa';
var upper = ''.toUpperCase;
var fn = upper.call;
// Now we have to specify the context for both upper and fn
console.log( fn.call(function() { return upper.call(str)}) ); // AAA
在您的示例中,fn()
正在尝试调用call
但它没有指定上下文,通常默认为window
对象,但在这种情况下,它只是使它的undefined
,这在 Chrome 中触发了一个奇怪的错误(如您所发现的),但 Firefox 更清楚这个问题,
TypeError: Function.prototype.call 在不兼容的 undefined 上调用