函数调用方法有什么用

What is the use of function.call method?

本文关键字:什么 方法 函数调用      更新时间:2023-09-26
var x = 10;
var o = { x: 15 };
function f()
{
    alert(this.x);
}
f();
f.call(o);

第一个将显示"10",第二个将显示"15"作为输出值。谁能说出我会同时使用"调用"方法和 f(( 的实时场景。

我只是在浏览未回答的问题,我不确定这是否会对您有所帮助,但它可能会帮助偶然发现这个问题的人。

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

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

call()期望参数采用逗号分隔的格式,而apply()期望它们在数组中。对于两者,第一个参数是将覆盖this的对象。

ECMA 规范

ECMA 规范(pdf 警告(对call()显示了它在更改特定函数的执行上下文中的使用:

13.2.1 [[呼叫]]

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

  1. 让 funcCtx 成为使用 F 的值为函数代码建立新执行上下文的结果 [[FormalParameters]] 内部属性、传递的参数 List args 和 this 值,如中所述 10.4.3.
  2. 让结果是计算 FunctionBody 的结果,该函数体是 F 的 [[Code]] 内部属性的值。如果 F 没有 [[Code]] 内部属性,或者如果其值为空的 FunctionBody,则结果为 (normal, 未定义,为空(。
  3. 退出执行上下文 funcCtx,恢复以前的执行上下文。
  4. 如果 result.type 是抛出的,则抛出 result.value。
  5. 如果 result.type 是 return,则返回 result.value。
  6. 否则,result.type 必须为正常。返回未定义。

谁能说出我会同时使用"调用"方法和 f(( 的实时场景。

作为对象

方法的函数应该使用该对象作为它们的 this 进行调用,例如,使用内置的 Array.prototype.forEach 方法,该方法期望这是一个 Array 实例。

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

Array.prototype.forEach.call(
  document.getElementsByTagName('*'),
  function(element){ 
    console.log('This element is a ' + element.tagName)
  }
);

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

上面的调用有时缩短为:

[].forEach.call(...)

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

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