在Scala中,具有两个参数的函数的类型为:
class Function2[InputTypeParameter1,InputTypeParameter2, OutputTypeParameter] {
def apply(x:InputTypeParameter1,y:InputTypeParameter2 ):OutputTypeParameter=f(x,y);
}
Function###
类有一种方法apply
。当方法用作函数对象时,它将更改为具有apply
方法的函数对象
方法不能是Function###
个对象,因为如果它们是,它们会有一个方法apply
,它将是一个Function###
对象,它有一个方法apply
公顷...
JavaScript是否以类似的方式工作?
答案 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代码执行的细节。我将简要介绍所发生的事情:
this
。如果您想深入了解这一点,我刚才所说的所有内容都可以在EMCAScript Language Specification中找到。