在Javascript中调用不带括号的函数()

在Javascript中调用不带括号的函数(),javascript,function,invocation,Javascript,Function,Invocation,案例1: 案例2: function square(x) { return x*x; } var s = square(); // Invoking with parentheses console.log(square(2)); console.log(s(2)); 函数总是应该用()调用。那么为什么它在案例1中返回undefined,但在案例2中运行良好呢?在案例1中,您将调用('calling')square函数的返回值指定给s。但是,由于您没有提供任何参数,因此您要求它计算undef

案例1:

案例2:

function square(x) { return x*x; }
var s = square(); // Invoking with parentheses 
console.log(square(2));
console.log(s(2));
函数总是应该用()调用。那么为什么它在案例1中返回undefined,但在案例2中运行良好呢?

在案例1中,您将调用('calling')square函数的返回值指定给
s
。但是,由于您没有提供任何参数,因此您要求它计算
undefined*undefined
,即
NaN
(“不是数字”,即无法计算)。然后在你做
s(2)
的最后,我假设你得到了一个错误,因为
s
不是一个函数

在案例2中,您没有调用函数,只是将函数对象本身分配给
var s
。这意味着它在执行
s(2)
操作时有效,因为
s
是对
square
函数的引用。

在案例1中,您将调用('calling')square函数的返回值指定给
s
。但是,由于您没有提供任何参数,因此您要求它计算
undefined*undefined
,即
NaN
(“不是数字”,即无法计算)。然后在你做
s(2)
的最后,我假设你得到了一个错误,因为
s
不是一个函数


在案例2中,您没有调用函数,只是将函数对象本身分配给
var s
。这意味着它在执行
s(2)
操作时有效,因为
s
是对
square
函数的引用。

在案例1中,您将
s
分配给
square()
的输出。因此,您没有传递任何内容,而是将
s
分配给
未定义的


s
赋值给
square
不带括号
()
之所以有效,是因为将
s
赋值给函数
square
,而不是它的输出。

在案例1中,将
s
赋值给
square()
的输出。因此,您没有传递任何内容,而是将
s
分配给
未定义的


s
分配给
square
不带括号
()
s
有效,因为您是将
s
分配给函数
square
,而不是它的输出。

这里的情况2有效-请检查注释以便更好地理解

function square(x) { return x*x; }
var s = square;// invoking without parentheses 
console.log(square(2));
console.log(s(2));

在这里,案例2起作用-请检查评论以便更好地理解

function square(x) { return x*x; }
var s = square;// invoking without parentheses 
console.log(square(2));
console.log(s(2));

就像C#中的代表?我不知道,但可能不是同一件事。。。关键是,在Javascript中,函数是一种对象类型,就像C#中的委托一样?我不知道,但可能不是同一件事。。。关键是,在Javascript中,函数与其他任何函数一样都是一种对象类型。调用发生在表达式
s(2)
,而不是
s=square
!?也没有参数。获取
未处理的错误:“s”不是案例1中的函数。调用发生在表达式
s(2)
,而不是
s=square
!?也没有参数。获取
未处理的错误:“s”不是案例1的函数。