50

可能重复:
JavaScript:var functionName=function(){}与function functionName(){{}
用JavaScript声明函数

我看到了在javascript中定义函数的两种不同语法:

函数f(){...}

以及

var f=函数(){...};

这些有什么区别?他们中有人反对吗?

1

1答案1

重置为默认值
47

两者都不推荐使用,而且都可以使用。不同之处在于其中一个是命名函数(函数f())另一个是一个等于函数的变量(var f=函数()).

将变量设置为函数时必须小心。这将起作用:

var f=函数(n){控制台.log(n);};f(3);//日志3

但这将中断,因为变量已定义之后对它的呼唤。

f(3);//f是什么?打破。var f=函数(n){控制台.log(n);};

但正常功能正常。

函数abc(n){console.log(n);}abc(3);//日志3xyz(5);//日志5函数xyz(n){console.log(n);}

这是因为代码在执行之前进行了分析,并且所有函数都可以调用。但将var设置为函数就像将var设为其他任何值一样。发生的顺序很重要。

现在来看一些更令人困惑的东西。。。

还有“自我执行”匿名函数。他们有各种各样的名字。最常见的方法如下:

(函数(){//此处的代码将立即执行//因为末尾的()执行这个(函数(){})})();

也有一个更好的版本。

!函数(){//同样,tailing()将执行此操作}();

结账此堆栈溢出帖子有关匿名函数的更多信息,请参阅。

6
  • 1
    您还可以使用自荐命名函数:(函数foo(){…}()),或指定给变量的命名函数:var foo=函数bar(){…};。实际值得注意的区别是,一个是函数声明始终必须命名,而函数表达式可以是命名的,也可以是匿名的。 评论 2012年2月24日0:53
  • @FelixKling说得好。自我调用的命名函数(函数foo(){…}())很有趣,因为你可以打电话foo公司来自内部,而不是外部。即使将其写为!函数foo(){…}();.
    – 马歇尔
    评论 2012年2月24日0:59
  • 1
    是的,当您有一个命名函数表达式时,该名称仅在函数内部可用。遗憾的是,IE在命名函数表达式方面存在一些问题(它会创建同一函数的两个副本),因此最好避免这样做。但从理论上讲,它是可行的;) 评论 2012年2月24日1:03
  • 6
    是什么!在最后一个函数定义之前?
    – 尤尔根
    评论 2013年8月15日20:46
  • 2
    @尤尔根,看stackoverflow.com/questions/3755606/…很好的解释
    – 馅饼
    评论 2014年1月24日21:12

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.