2013-10-03 43 views
1

是什么VAR的varName = funcname函数(){}

var a = function() {} 

var a = function b() {} 

后者,b为未定义区别?

+0

@iJay:不,它没有错 –

+0

后者将具有'name'属性,'a.name ==='b'' –

+0

在后者中,b仅在函数内定义,但应该在外部未定义它。目的是允许匿名函数递归。老的Mozilla或IE(不记得)有一个bug,其中b在函数外部没有被定义 - 但递归的东西仍然有效。 – slebetman

回答

4

第二个是named anonymous function - 这个名字会出现在一个堆栈跟踪(否则在堆栈跟踪会带您看到的只是“匿名函数”)

+1

中得到解答。从技术上讲,它被称为a命名函数表达式。它被用来实现递归匿名函数,因为你不再允许在html5严格模式下使用arguments.callee – slebetman

+0

@Darhazer:谢谢!如果我打印出a.name,后者将返回“b”。 –

+0

@slebetman:也许你正在考虑JavaScript的严格模式,而不是HTML。 –

4

首先是一个匿名函数表达式,第二个命名函数表达式,都在Javascript中有效。

例如,它可以用于递归而不使用arguments.callee(不允许在严格模式下使用),因为它引用自身,无论在哪里。参考范围是本地唯一的功能,那就是它是不可访问全球内:可以省略

var a = function b(){ 
    return b; 
}; 
function c() { 
    return c; 
} 
var d = function e() { 
    return e(); 
}; 
d(); // maximum call stack size exceeded :P 
var f = c; 
c = null; 
f(); // null 
a(); // function 
b();// undefined not a function 
b; // not defined 
a()(); // same function again 
+1

您还有一件事从您的例子中忘记了:调用返回的“b”的a()()(在这种情况下本身就是这样,所以它只是有点愚蠢,但是提供了信息) – slebetman

1
var a = function() {} 

功能名称。在这种情况下,函数名称被省略。这些功能称为匿名功能。

阅读关于javascript作用域和匿名函数优点和缺点的细节。