在阅读关于IronJS的文章时,我可以在这篇文章中http://ironjs.wordpress.com/
以下是:
* 上下文相关功能关键字
如果您不知道,这两个函数不相同:
(function bar() { })
function foo() { }
找出我将作为练习留给读者的差异。
有人可以在这解释一下这个区别吗?
答案 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
。