JavaScript函数对象与Scala函数对象有何不同

How are JavaScript function objects different from Scala function objects?

本文关键字:对象 函数 何不同 JavaScript Scala      更新时间:2023-09-26

在Scala中,具有两个参数的函数的类型为:

class Function2[InputTypeParameter1,InputTypeParameter2, OutputTypeParameter] {
  def apply(x:InputTypeParameter1,y:InputTypeParameter2 ):OutputTypeParameter=f(x,y);
}

Function###类有一个方法apply。当一个方法用作函数对象时,它将变为具有apply方法的函数对象
方法不能是Function###对象,因为如果是,它们将有一个方法apply,该方法将是一个Function###对象,该方法apply将具有。。。

JavaScript的工作方式类似吗?

javascript中的函数是什么

MDN很好地描述了功能:

在JavaScript中,函数是一流的对象,即对象,并且可以像其他对象一样进行操作和传递对象具体来说,它们是Function对象。

函数是由Function.prototype(其根是Object.protype)形成的

如何在javascript中解释函数

CCD_ 8包括方法CCD_

调用(执行)一个函数并将其this设置为所提供的值,参数可以按原样传递。

您可能已经看到过明确使用call()来传递this的代码,如下所示:

function speak(phrase) {
  document.write(phrase + ' ' +  this.name);
}  
function foo() {
  this.name = "Foo";
}
speak.call(foo, "Hello");

在内部,Javascript对所有函数/方法调用都使用Function.prototype.call()方法。所以

function speak(phrase) {
  document.write(phrase);
}
speak("Hello");

实际上被解释为:

function speak(phrase) {
  document.write(phrase);
}
speak.call(window, "Hello");

根据ECMAScript 5,当使用严格模式时,有一个细微的变化:

speak.call(undefined, "Hello"); 

请注意,它没有将window作为this参数传递,而是传递了undefined

最后,当使用函数作为对象的一种"方法"时:

var speaker = {
  speak: function(phrase) {
    document.write(phrase);
  }
}
speaker.speak("Hello");

成为

var speaker = {
  speak: function(phrase) {
    document.write(phrase);
  }
}
speaker.speak.call(speaker, "Hello");

javascript函数与Scala函数/方法的比较

虽然我不了解Scala,但我确实查阅了一些关于apply方法的信息,它听起来有点类似于call()。同样根据这个其他SO答案

在发动机罩下,功能和方法。一般来说,普通方法产生的开销比函数(从技术上讲,它是一个具有应用方法的对象)。

因此,我认为javascript函数与Scala函数对象非常相似。但是javascript中的方法实际上只是函数,实际上只是对象,所以javascript方法与Scala方法不同。希望这能回答你的问题。

更新:javascript的call()方法如何工作

call()是使用函数对象的内部方法[[call]]的抽象操作。内部[[call]]方法让我们深入了解javascript代码执行的实质。我只想了解一下发生了什么:

  1. 执行javascript内部操作PrepareForOrdinaryCall是为了处理更多与上下文相关的内容
  2. 另一个内部操作OrdinaryCallBind发生这种情况。。。这设置了更多与上下文相关的内容,以及在执行过程中要使用的函数的CCD_ 22
  3. 执行第三个内部操作OrdinaryCallEvaluateBody。这就是实际解析、解释和执行函数体的地方

如果您想深入了解这一点,我刚才所说的所有内容都可以在EMCAScript语言规范中找到。