版本 1
function sayHello2(name){
var text='Hello'+name;
var say=function(){
console.log(text);
};
return say;
}
var say2=sayHello2("David");
say2();
版本 2
function sayHello2(name){
var text='Hello'+name;
var say=function(){
console.log(text);
};
return say;
}
sayHello2("David")();
问题:
- 为什么在版本一中,当您使用 var say2 调用 sayHello2 时,无需添加另一组空括号?
- 如果我去掉 return say; 行,错误消息会说 sayHello2 不是一个函数,为什么?
- 为什么说say2()是重点; (版本2的最后一行)?如果我删除该行,则不会发生任何变化,“HelloDavid”仍将被记录。
最佳答案
在两个代码示例中,都进行了两次函数调用。第一个和第二个的区别在于,在第一个样本中,第一个函数调用的结果存储在
say2
中。在进行第二个函数调用之前。第二个示例立即使用sayHello2()
的返回值调用返回的函数。如果没有
return
声明,然后sayHello2()
返回undefined
.这个问题的主张是删除
say2();
行不会改变行为,是不正确的。如果你不打电话say2()
那么什么都不会被记录。
查看sayHello2()
:
function sayHello2(name){
// Initialize the text that will be logged
var text='Hello'+name;
// Create the function that will log the message
var say=function(){
console.log(text);
};
// Return the logging function
return say;
}
sayHello2()
函数返回对调用 console.log()
的小函数的引用。由于函数是 JavaScript 中的对象值,因此对函数的引用与任何其他类型的值一样有效,并且可以存储在变量中或在表达式中使用。
请注意,当创建日志记录函数时,这是通过 var
完成的。初始化:
var say=function(){
console.log(text);
};
这本质上与变量 say2
发生的情况相同。 :
var say2=sayHello2("David");
除了这里,在 =
的右侧标志有一个函数调用而不是函数实例化。
声明
say2();
因此正在调用从调用 sayHello2()
返回的小日志记录函数.
第二个代码示例执行相同的操作:
sayHello2("David")();
除了返回的函数引用没有中间存储之外。相反,该引用会立即用于进行第二个函数调用。
在第一个版本中,计算进行的函数调用:
var say2 = sayHello2("David"); // First function call
say2(); // Second function call
在第二个版本中:
// First // Second
sayHello2("David")();
在 JavaScript 中,形式的表达式
something()
始终表示“将 something
解释为对函数的引用,并调用它(不传递任何参数)”。如果something
不是对函数的引用,你会得到一个异常。所以在版本 2 中,我们的 something
是 sayHello2("David")
。因为后面有第二组空括号,这意味着我们正在告诉 JavaScript 进行另一个函数调用。
关于javascript - 如何使用闭包调用 Javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190193/