2012-12-28 90 views
2

从我从其他主题中读到的有关SIAF或自我调用匿名函数的简单描述中,它只是作为一个容器,它限制了变量的范围(从我所了解的内容)。现在,问题是,为什么我可以这样做:自我调用匿名函数的语法

$("ul>li").click((function(){ 

})); 

但是不能在其后添加另一个SIAF?像这样:

$("ul>li").click((function(){ 

})); 

(function(){ 

}); 

这是怪我,因为这,只是对自己的SIAF让我在IDE中没有任何错误:

$("ul>li").click((function(){ 

})); 

(function(){ 

}); 
+6

您的问题中的所有功能都不会被发布的代码调用。它们只是函数实例化表达式。 – Pointy

+0

他们都不是自我调用。你需要一个'()'或一个'.call()'或一个'.apply()'来表示它们是如此。 – techfoobar

+1

我总是听到他们叫做IIFE:“立即调用函数表达式”。出于好奇,你的术语从哪里来? –

回答

9

此:

(function() { .. }); 

是一个无操作表达式,特别是它不涉及函数调用。一个函数对象被实例化,但它没有以任何方式使用。

此:

(function() { ... })(); 

做一些事情,因为要调用()导致函数尾随。 (它不会自动调用)。

在JavaScript中,对函数的引用只是一个值,而函数只是一个对象(当然也是一个特殊对象)。当对函数的引用后面跟着一个加括号的值列表时,那么这是一个函数调用。这个函数的引用来自何处并不重要。 (来自何处能影响函数调用的语义,而不是功能的基本事实调用自身。)

编辑 —术语“自调用函数式”取得了一定的货币。我不会介入争议,但在我看来,它不如替代的“立即调用的函数表达式”更准确,因为真正的函数不能从外部调用它自己。它可以包括对自己的呼叫,但完全不同。但是我理解这个词的精神,我认为它是无害的。

+2

**它不会自动调用**由于OP已经多次使用*自我调用,因此**部分更加显着。 – techfoobar

+0

谢谢你。非常有意义。它与所有的大括号和括号有点混淆。 –

+0

@GamesBrainiac是的,我同意;它不会帮助'function'关键字在JavaScript中执行双重任务。 – Pointy