JavaScript中匿名函数和内联函数有什么区别?

22

这个标题概括了我的问题。提供一个能够展示这一观点的例子会很好。


1
你猜怎么样?有什么假设吗?给我们一些提示。 - andrewb
1
我看不出为什么这个问题应该被踩。 - user504674
andrewb: 我目前的理解是内联函数是具有名称的匿名函数...这样做的原因是为了使函数能够在递归中调用自身。请注意,我是JavaScript的新手,仍在学习中。虽然我有C#和.NET的经验,但这是一种全新的思维转变。 - matori82
1
因为已经关闭,所以无法回答,但是这里的每个人都很困惑。匿名函数和内联函数不是相反的概念。JS 没有内联函数。有匿名函数:function() {}; 和命名函数:function foo(x) {};。然后,还有函数引用var foo = function() {};。在这个例子中,引用指向一个匿名函数!你也可以引用一个命名函数:var foo = function bar() {};。最后,还有回调函数:foo.test(function() {});(同样是匿名的 - 但也可以是命名的!),它们也可以通过引用传递(并且是闭包)。 - Ben
不要关闭这样的问题,否则ChatGPT将很乐意回答它。 - Salvador Valencia
4个回答

37

首先,JavaScript中似乎没有关于内联函数的共识定义。我认为内联函数是JavaScript函数的一种特殊情况。一个内联函数是指在运行时创建的分配给变量的函数,而不是在解析时创建。

匿名函数和内联函数实际上是相同的,因为它们都是在运行时创建的。区别在于内联函数分配给变量,因此可以重复使用。这样,内联函数与常规函数的工作方式相同。

在es6之前,匿名函数和内联函数类似于常规函数一样使用函数关键字声明。随着es6的出现,匿名函数和内联函数还可以使用更紧凑的箭头函数语法进行声明。

Function

function func() {
    alert ('function');
} 
$('a').click(func);

内联函数

var func = function() { 
    alert ('inline') 
};
$('a').click(func);

// Alternative es6+ inline arrow function.
let func2 = () => alert('inline');
$('a').click(func2);

匿名函数

$('a').click(function() {
    alert('anonymous');
});
// Alternative es6+ anonymous arrow function.
$('a').click(() => alert('anonymous'));

请注意,关于性能惩罚的链接有点不确定。也许7年后,可以安全地假设在性能方面没有太大差异? - bluenote10
同意@bluenote10。至少这是离题了。 - Daniel Gimenez
“created at runtime/parsetime”是什么意思?所有的JavaScript函数都是运行时对象;这一点尤其正确,因为它们是闭包。如果它们被内联或其他方式从程序中删除,那就是实现细节。 - Quelklef

7

内联函数有所不同,引用自维基百科:

内联函数是一种编译器被要求执行内联扩展的函数。换句话说,程序员已经请求编译器在每个调用该函数的地方插入完整的函数体,而不是生成调用该函数的代码在它定义的一个地方。编译器没有义务遵守这个请求。

Javascript不支持内联函数的概念。但我在网上找到了一些关于回调函数的参考,例如:

(function(){
  setTimeout(/*inline function*/function(){ /*some code here*/ }, 5);})
();

这些被称为内联函数。正如您所见,这些函数没有任何名称,因此它们与匿名函数本质上是相同的。我认为,由于您在使用它的地方定义了该函数,因此它被内联函数引用,但名称“匿名函数”最好描述了该概念。


3

匿名函数的定义方式如下

var x = 1;
(function(x){
    // Do something
    console.log(x); // 1
})(x);

然而,内联函数的定义对我来说有些不清楚。

1

Inline function

var foo = function (){ 
   alert('Hello') 
}
setTimeout(foo, 100);

匿名函数

setTimeout(function(){ 
   alert('Hello') 
}, 100);

他们在做同样的事情,但是内联函数更适合重复使用。匿名函数适用于一次性使用,因为您不需要担心它的名称会与其他变量冲突,而且它更短。

所以这取决于您的情况。


匿名函数在JavaScript的面向对象编程中被广泛地重复使用。可以通过查看CoffeeScript生成的JavaScript来证明这一点。 - CSStudent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接