【问题标题】:Javascript Function Definition Syntax [duplicate]Javascript函数定义语法[重复]
【发布时间】:2012-03-14 11:40:42
【问题描述】:

可能重复:
JavaScript: var functionName = function() {} vs function functionName() {}
Declaring functions in JavaScript

我见过 2 种在 javascript 中定义函数的不同语法:

function f() {
   ...
}

还有

var f = function() {
    ...
};

这些有什么区别?其中之一是否已弃用?

【问题讨论】:

标签: javascript function syntax


【解决方案1】:

两者都已弃用,两者都可以使用。这里的区别在于,一个是命名函数(function f()),而另一个是等于函数的变量(var f = function())。

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

var f = function(n) { console.log(n); };
f(3); // logs 3

但这会中断,因为变量是在调用它之后定义的。

f(3); // what is f? breaks.
var f = function(n) { console.log(n); };

但是正常的功能可以正常工作。

function abc(n) { console.log(n); }

abc(3); // logs 3
xyz(5); // logs 5

function xyz(n) { console.log(n); }

这是因为代码在执行前经过分析,所有函数都可以调用。但是将 var 设置为等于函数就像将 var 设置为其他任何内容。发生的顺序很重要。

现在是一些更令人困惑的东西......

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

(function() {
    // code in here will execute right away
    // since the () at the end executes this (function(){})
})();

还有一个可以说更好的版本。

!function() {
    // again, the tailing () will execute this
}();

查看this Stack Overflow post 了解有关匿名函数的更多信息。

【讨论】:

  • 您还可以有自调用命名函数:(function foo() {...}()),或分配给变量的命名函数:var foo = function bar() {...};。真正值得注意的区别在于,函数声明总是必须被命名,而函数表达式既可以命名也可以匿名。
  • @FelixKling 好点。自调用命名函数(function foo() {...}()) 很有趣,因为您可以从内部调用foo,但不能从外部调用。即使写成!function foo() {...}();
  • 是的,当您有一个命名函数表达式时,该名称仅在函数本身内部可用。遗憾的是,IE 在命名函数表达式方面存在一些问题(它会创建同一个函数的两个副本),因此最好避免使用。但理论上它有效;)
  • 什么是!在最后一个函数定义之前?
  • @Juergen 请参阅 stackoverflow.com/questions/3755606/… 以获得很好的解释
猜你喜欢
  • 2016-04-13
  • 2019-04-14
  • 2017-08-26
  • 1970-01-01
  • 2015-09-06
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
相关资源
最近更新 更多