【问题标题】:var varName = function funcName() {} [duplicate]var varName = function funcName() {} [重复]
【发布时间】:2013-10-09 21:23:47
【问题描述】:

有什么区别

var a = function() {}

var a = function b() {}

后者,b是未定义的?

【问题讨论】:

  • @iJay:不,没有错
  • 后者会有一个name属性,a.name === 'b'
  • 在后者中,b 仅在函数内部定义,但在函数外部应未定义。目的是允许匿名函数递归。较旧的 Mozilla 或 IE(不记得)有一个错误,其中 b 在函数外部未定义 - 但递归仍然有效。
  • @Pumbaa80:不重复,我在提问之前已经阅读过该主题。无论如何,谢谢!
  • @Qantas94Heavy 我知道问题是不同的。已经询问了数十种变体(例如,stackoverflow.com/questions/1013385),但它们都在stackoverflow.com/a/338053/27862中得到了回答

标签: javascript function


【解决方案1】:

第二个是named anonymous function - 该名称将出现在堆栈跟踪中(否则在堆栈跟踪中您只会看到“匿名函数”)

【讨论】:

  • 技术上称为命名函数表达式。它用于实现递归匿名函数,因为您不再允许在 html5 严格模式下使用 arguments.callee
  • @Darhazer:谢谢!如果我打印出 a.name,后者将返回“b”。
  • @slebetman:也许你想到的是 Javascript 的严格模式,而不是 html。
  • @Qantas94Heavy:是的,就我而言,我的意思是 ES5 中定义的新的 javascript 严格模式。
【解决方案2】:

第一个是匿名函数表达式,第二个是命名函数表达式,都在 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

【讨论】:

  • 您从示例中忘记的另一件事:a()() 它调用了返回的“b”(在这种情况下它本身就是它,所以它有点傻,但仍然提供信息)
【解决方案3】:
var a = function() {}

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

详细了解 javascript 作用域和匿名函数的优缺点。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 2013-03-03
    • 2018-04-17
    • 2011-05-17
    • 2022-01-18
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多