【问题标题】:Javascript function returning global assigned to itself, then assigned to something elseJavascript函数返回全局分配给自己,然后分配给别的东西
【发布时间】:2015-03-12 02:50:27
【问题描述】:
var bar = function foo() {
  foo = 1;
  return foo;
};
bar(); // returns function foo()

为什么会这样?我希望这会返回 1。

【问题讨论】:

  • 这不是语法错误吗?你能命名一个这样的匿名函数吗?
  • 好吧,如果是语法错误,为什么我的 Firefox 接受该语言?
  • @Thilo 这是 JS,一堆(可能)坏事在技术上是合法的。这是合法的事情。但这并没有多大意义……foobar 都将引用相同的函数。
  • 不,bar 将代表函数声明返回的内容。

标签: javascript


【解决方案1】:

如果你想让它返回1,你需要这样写:

var bar = function() {
  foo = 1;
  return foo;
};

LVarayut's answer 实际上是正确的,您正在编写全局命名空间中的 foo 。这个版本声明了一个局部变量 foo。

var bar = function() {
  var foo = 1;
  return foo;
};

【讨论】:

  • 我知道。但我很想知道为什么会这样。
  • @jetru a 您正在为 bar 分配一个函数 declaration。不是函数本身。
【解决方案2】:

这是一个描述相同行为的类似问题......

Function and variable with the same name

还有一篇描述正在发生的事情的链接文章......

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

【讨论】:

    【解决方案3】:

    这是因为你已经定义了两次 foo 变量,所以如果你想返回 1,你可以把你的函数名改成别的:

    var bar = function baz() {
      foo = 1;
      return foo;
    };
    bar(); // returns 1
    

    或者你可以定义一个局部变量:

    var bar = function foo() {
      var foo = 1;
      return foo;
    };
    bar(); // returns 1
    

    编辑: 这是您问题的答案。命名函数表达式的名称成为局部变量,只能在函数表达式内部访问。函数名称和分配给函数的变量之间存在区别。 函数名不能更改,而函数分配给的变量可以重新分配。

    Read more on MDN

    【讨论】:

    • var bar = function foo(){}... 你能解释一下这个“命名匿名函数”语法是如何工作的吗?
    • @Thilo 看到这个问题:stackoverflow.com/questions/3854141/….
    • @Thilo,是的,这个命名函数表达式在你的函数中有一些错误时非常有用,因为编译器可以告诉你导致错误的确切函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多