javascript函数的行为不同

javascript函数的行为不同,javascript,Javascript,我在javascript中有一个函数: var a=函数greet(){ console.log(“你好”); } var b=a; b()在第一个示例中,您将函数分配给变量a,然后使b引用变量a。然后调用执行函数a的b 在第二个示例中,您正在创建一个函数,但没有分配或调用它。如果在第二个示例中只调用函数,它将按预期工作 函数{ console.log(“你好”); } 问候()如前所述,定义函数表达式时,RHS上的函数被视为匿名函数。不会注册此函数的引用 示例: var a=函数测试()

我在javascript中有一个
函数

var a=函数greet(){
console.log(“你好”);
}
var b=a;

b()在第一个示例中,您将函数分配给变量a,然后使b引用变量a。然后调用执行函数a的b

在第二个示例中,您正在创建一个函数,但没有分配或调用它。如果在第二个示例中只调用函数,它将按预期工作

函数{
console.log(“你好”);
}

问候()如前所述,定义函数表达式时,RHS上的函数被视为匿名函数。不会注册此函数的引用

示例:

var a=函数测试(){
控制台日志(“测试”);
}
test()
显示错误的原因是您立即调用了函数,但未使用“()”包装函数体。因此,立即调用函数应遵循以下模式:

(fucntion(){ /* code*/ })()

但您的第一个示例之所以有效,是因为您将函数存储在变量中,然后将其作为回调样式调用。

不确定,但
function fn(){}
将其作为函数声明,其中as
var fn=function(){}
是赋值。因此,该函数被视为匿名函数并立即调用。它首先失败,因为您正在调用尚未添加引用的命名函数heap@Rajesh你不妨这样回答。这正是问题所在。:)downvote的原因是什么?OP的第四个示例“工作”与在控制台中记录“Hello”一样,因为它确实执行该函数。@nnnnnn您是对的。我似乎找不到关于function(){}()风格语法的文档,你能链接一些东西吗?或者,如果这不是一个方法,为什么第四个会起作用呢?
function(){}
部分是一个函数表达式,
()
会立即调用它,函数的返回值会分配回
变量。(尽管在本例中,它返回
未定义的
,因为它没有
返回
语句。)任何函数表达式都可以通过添加
()
立即调用,基本上,每当你在任何操作符后面看到关键字
function
时,你就有了一个函数表达式,而不是一个函数语句。@nnnnnn有没有我可以阅读的文档?真正对结尾的()部分感到好奇。试试Ben Alman在上的文章。错误不是因为
测试
尚未定义,而是语法错误,不允许您使用
()
跟随函数语句。这就是为什么错误是“Uncaught SyntaxError:unexpected token”,而不是ReferenceError。@nnnnnn我没有意识到这一点,因此我提到了,我不确定。但请编辑答案,因为这将有助于其他人。另外,如果它不被允许,那么问题就会出现,为什么匿名函数允许它呢?允许使用函数表达式,但不允许使用函数语句。函数表达式不一定是匿名的。@nnnnnnnn那么我猜我的假设是错误的,这个答案只会误导。你能给出一个答案吗(如果你有空的话),因为这是很多人(包括我)都会问的问题,这会有帮助。@nnnnnn所以分组运算符需要包含一个函数表达式?
(fucntion(){ /* code*/ })()