这里有什么问题? 我创建了一个函数closureDemo,它接受另一个函数,它不接受任何参数并且不返回任何东西。 当我调用closureDemo时,我传递一个符合此条件的函数。 但我没有得到预期的输出。我期待以下输出: -
function createDiv (array) {
var i;
var target = document.getElementById("container");
for(i = 0; i < array.length; i++) {
target.appendChild("<div>" + array[i] + "</div>");
}
}
但只有第一行被打印出来。 有人可以解释一下这里发生了什么
This is a demo application
this is a demo for closure
谢谢,
阿玛尔
答案 0 :(得分:3)
op
参数closureDemo
是按名称调用的,这意味着在您调用它之前不会对其进行评估。这很好,因为你在main
中调用它,但是,你正在传递() => println(...)
,这是一个零参数的函数。在closureDemo
的主体内,对op
的调用返回一个函数,但不调用该函数。
如果您希望closureDemo
保持按名称调用,则不应将其传递给函数,如下所示:
closureDemo(println("this is a demo for closure"))
如果您只想传递closureDemo
函数,而您希望稍后调用零参数,则其签名应反映出:
def closureDemo(op: () => Unit) = {
op()
}
答案 1 :(得分:2)
这是因为closureDemo演示采用了一个名字参数。 并且在main函数的closureDemo调用中,您只是创建/定义一个无参数函数而不调用它。因此,通过强制评估新创建的函数,您将获得预期的结果
closureDemo {
(() => println("this is a demo for closure")).apply()
}
或者你可以简单地调用,因为你对closureDemo的输入不是一个函数,而是一个名字参数(代码块)
closureDemo(println("this is a demo for closure"))