Javascript函数声明类型之间的差异

时间:2011-06-22 20:30:25

标签: javascript

在阅读关于IronJS的文章时,我可以在这篇文章中http://ironjs.wordpress.com/

以下是:

* 上下文相关功能关键字

如果您不知道,这两个函数不相同:

(function bar() { })  

function foo() { } 

找出我将作为练习留给读者的差异。

有人可以在这解释一下这个区别吗?

4 个答案:

答案 0 :(得分:9)

function foo() { }

创建一个函数

(function foo(){ })

返回一个函数对象。您也可以使用:

(function foo(){ })(bar)

并制作一个匿名函数。 (请注意,(bar)表示在该函数this中引用bar实例。)

查看this other SO post了解详情。

答案 1 :(得分:6)

我猜测的不同之处在于,第一个对全局范围不可见,后者在全局范围内可见。

答案 2 :(得分:4)

扩展@ Amir的回答:

js>(function bar() {})(3)
js>bar
console:1       ReferenceError: bar is not defined
js>function foo() {}
js>foo
function foo() {
}

(代码在jsdb中执行)

这些是命名函数,如果不在函数定义周围添加括号,它们将成为本地范围的一部分。 function foo() {}稍后可供使用,但bar没有。

作为第三个例子:

var x = function baz() {};

如果你运行:

js>var x = function baz() {}
js>baz
console:1       ReferenceError: baz is not defined

您会注意到它与(function baz(){})(3)类似。

的情况
function foo() {}

很特别,Javascript解释器看到那个表单并说:“哦,你正试图在本地范围内定义一个名为”foo“的函数。”

至于为什么命名函数即使没有在本地范围内定义也很有用 - 命名函数 从函数本身的范围内可见:

js>var x = function fact(n) { return n*((n < 2) ? 1 : fact(n-1)); }
js>x(3)
6
js>fact
console:1       ReferenceError: fact is not defined

这里我们有一个名为“fact”的阶乘函数,但名称“fact”只在函数本身的范围内可见。

答案 3 :(得分:2)

第一个函数是一个命名的匿名函数(是的)。表达式的计算结果为Function。第二个定义了一个命名函数并返回undefined