首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >function.call方法的用途是什么?

function.call方法的用途是什么?
EN

Stack Overflow用户
提问于 2012-09-03 23:18:59
回答 2查看 68关注 0票数 1
代码语言:javascript
复制
var x = 10;
var o = { x: 15 };

function f()
{
    alert(this.x);
}

f();
f.call(o);

第一个将显示'10‘,第二个将显示'15’作为输出值。谁能告诉我在哪个实时场景中,我会同时使用'call‘方法和f()。

EN

回答 2

Stack Overflow用户

发布于 2013-02-27 00:17:48

我只是浏览了一下未回答的问题,我不确定这是否会对你有所帮助,但它可能会帮助那些偶然遇到这个问题的人。

通过在函数对象上使用call()方法,可以覆盖函数要引用的this对象。您已经在自己的代码块中演示了预期的结果。

可以注意到,除了预期的参数格式之外,apply()方法执行的功能与call()几乎相同。

call()需要逗号分隔格式的参数,而apply()需要数组形式的参数。对于两者,第一个参数是将覆盖this的对象。

ECMA规范

对于call()ECMA specification (pdf warning)是这样说的,它展示了它在更改特定函数的执行上下文时的用法:

13.2.1 [调用]

当使用this值和>参数列表调用函数对象F的[Call]内部方法时,将执行以下步骤:

  1. 设置funcCtx为使用F的[FormalParameters]内部属性的值、传递的参数列表args和this值为函数代码建立新执行上下文的结果,如10.4.3中所述。
  2. 设置结果为计算FunctionBody的结果,该结果是F的[ code ]内部属性的值。如果F没有[ FunctionBody ]内部属性,或者如果它的值为空代码,则结果为( normal,undefined,empty )。
  3. 退出执行上下文funcCtx,还原以前的执行上下文。
  4. 如果抛出result.type,则抛出result.type is return,则返回result.type必须是正常的。返回未定义。
票数 3
EN

Stack Overflow用户

发布于 2015-01-17 06:45:17

任何人都知道在哪个实时场景中,我会同时使用‘

’方法和f()。

作为对象的方法的函数应该使用该对象作为其this来调用,例如,使用内置的Array.prototype.forEach方法,该方法期望该对象是一个数组实例。

但是,该方法是泛型的,因此实例不必是数组,它只需要是一个足够像数组的对象,该方法就可以工作。在大多数浏览器中,可以向它传递一个NodeList,这是一个主机对象(尽管有些浏览器不喜欢这样),所以您可以像这样调用传递NodeList的forEach

代码语言:javascript
复制
Array.prototype.forEach.call(
  document.getElementsByTagName('*'),
  function(element){ 
    console.log('This element is a ' + element.tagName)
  }
);

放在文档底部的脚本元素中,上面的代码会将每个元素的标记名写入控制台。

上面的调用有时缩写为:

代码语言:javascript
复制
[].forEach.call(...)

它创建一个新的数组实例,并使用它的[[Prototype]]链访问forEach。

因此,您可以看到,对于数组实例,需要使用普通的forEach,并将其单独用于调用。还有其他的情况,在调用方法时,可以将this设置为其他值(例如,DOM元素上的侦听器)。

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

https://stackoverflow.com/questions/12250503

复制
相关文章

相似问题

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