首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Function.prototype.call.call的缩写?

Function.prototype.call.call的缩写?
EN

Stack Overflow用户
提问于 2015-06-17 10:47:20
回答 3查看 460关注 0票数 3

调用函数的方法

考虑一下这个简单的函数:

代码语言:javascript
复制
function my(p) { console.log(p) }

我可以这样称呼它:

代码语言:javascript
复制
my("Hello");

也是这样:

代码语言:javascript
复制
my.call(this, "Hello");

此外,这是有可能的:

代码语言:javascript
复制
Function.prototype.call.call(my, this, "Hello");

功能方式的简写

我对最后一种选择感兴趣--这是最有效的选择,但由于时间太长,我试着做一个速记:

代码语言:javascript
复制
var call = Function.prototype.call.call;

为了这样称呼我:

代码语言:javascript
复制
call(my, this, "Hello");

但我得到了这个TypeError:

代码语言:javascript
复制
TypeError: Function.prototype.call called on incompatible undefined

有人知道吗,这里怎么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-17 10:49:13

当你说

代码语言:javascript
复制
var call = Function.prototype.call.call;

最后一个call失去了它的实际上下文。您需要明确地说call属于Function.prototype.call

您可以这样做,方法是创建一个新函数,它实际上像这样绑定它

代码语言:javascript
复制
var call = Function.prototype.call.call.bind(Function.prototype.call);
call(my, this, "Hello");
// Hello

bind函数返回一个新函数,该函数在调用时将上下文(this)设置为Function.prototype.call

票数 8
EN

Stack Overflow用户

发布于 2015-06-17 10:49:27

据推测,call在内部使用this

通过在没有上下文的情况下调用它,您已经将this的内部值从可以访问函数原型的东西更改为window

票数 4
EN

Stack Overflow用户

发布于 2015-06-17 10:49:11

如果您想这样做,那么请考虑这一点(如果您有一个符合ES5的解释器):

代码语言:javascript
复制
var call = Function.prototype.call.bind(Function.prototype.call)

绑定函数确保进行函数调用时的上下文( this变量)是Function.prototype.call而不是undefined,就像在您的例子中看到的那样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30889321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档