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

时间:2015-11-08 21:22:15

标签: javascript scala

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

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

Function###类有一种方法apply。当方法用作函数对象时,它将更改为具有apply方法的函数对象 方法不能是Function###个对象,因为如果它们是,它们会有一个方法apply,它将是一个Function###对象,它有一个方法apply公顷...

JavaScript是否以类似的方式工作?

1 个答案:

答案 0 :(得分:1)

javascript中的功能是什么

MDN很好地描述了函数:

  

在JavaScript中,函数是第一类对象,即它们   对象可以被操纵和传递,就像任何其他对象一样   宾语。具体来说,它们是Function对象。

函数由Function.prototype(其根为Object.prototype)组成。

如何在javascript中解释函数

Function.prototype包含方法Function.prototype.call()

  

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

您可能已经看到过显式使用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 answer

  

在幕后,功能和其他方面存在其他差异   方法。通常,普通方法产生的开销少于a   function(技术上是一个带有apply方法的对象)。

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

更新:javascript' call()方法如何运作

call()是一个使用函数对象的内部方法[[call]]的抽象操作。内部[[call]]方法将我们带入了javascript代码执行的细节。我将简要介绍所发生的事情:

  1. 执行javascript内部操作PrepareForOrdinaryCall,以便处理更多与上下文相关的内容。
  2. 另一个内部操作,OrdinaryCallBindThis发生......这会设置更多与上下文相关的内容以及在执行期间使用的函数this
  3. 执行第三个内部操作OrdinaryCallEvaluateBody。这是实际解析,解释和执行函数体的地方。
  4. 如果您想深入了解这一点,我刚才所说的所有内容都可以在EMCAScript Language Specification中找到。