为什么 call 不能用作排序函数?

Leo*_*tov 3 javascript v8

我正在阅读javascript 的好部分,作者给出了一个这样的例子:

['d','c','b','a'].sort(function(a,b) {
  return a.localeCompare(b);
});
Run Code Online (Sandbox Code Playgroud)

其行为符合预期。现在我尝试做这样的事情 - 这是下一个合乎逻辑的步骤:

['d','c','b','a'].sort(String.prototype.localeCompare.call);
Run Code Online (Sandbox Code Playgroud)

并且失败并出现错误:

TypeError: object is not a function
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么......有什么想法吗?

ick*_*fay 6

call需要绑定到localeCompare

['d','c','b','a'].sort(Function.prototype.call.bind(String.prototype.localeCompare));
Run Code Online (Sandbox Code Playgroud)

您遇到问题的原因是您正在通过sort Function.prototype.call。您可能知道,当没有this另外提供时,它将是全局对象(window在浏览器环境中)。因此,当sort试图调用传递给它的功能,它会调用callthis设置为全局对象,这在大多数(所有?)的情况下是不是一个函数。因此,您必须始终call如此绑定。thislocaleCompare