【问题标题】:Jquery: Why is function returning global var when calling a function inside a function?Jquery:为什么在函数内部调用函数时函数返回全局变量?
【发布时间】:2015-10-04 07:51:06
【问题描述】:

我不明白为什么下面的代码返回 1 而不是 10。你能解释一下吗?谢谢你!

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

【问题讨论】:

  • 一句话...吊装
  • @VeryCurious 你能搜索variable hoisting吗?不符合你的名字Very Curious(我怀疑)
  • 提升是 JavaScript 的默认行为,将所有声明移动到当前作用域的顶部(到当前脚本或当前函数的顶部)。 - w3schools.com/js/js_hoisting.asp
  • @JaromandaX 永远不要使用w3schoolsw3fools.com
  • @JaromandaX 是的,这就是我使用它的原因

标签: javascript jquery function return


【解决方案1】:

因为variable hoisting,你的功能

function bar() {
    foo = 10;
    return;
    function foo() { }
}

翻译为

function bar() {
    var foo; // hoisted variable declaration
    foo = 10; // now it is a number with value 10
    return; // here the function stops executing
    foo = function foo() { }; // now the variable *would* be a function, but this code is never reached
}

因此,全局不会被覆盖。

因为变量声明(以及一般的声明)是 在执行任何代码之前处理,在任何地方声明一个变量 在代码中相当于在顶部声明它。这也意味着 一个变量在它被声明之前可以被使用。这 行为被称为“提升”,因为看起来变量 声明被移到函数或全局代码的顶部。

【讨论】:

  • 最后一行应该是foo = function (){ }
  • 我不确定,我认为它也保留了名称。
  • 如果我放置 alert(typeof foo);在函数 bar() 的末尾,根据这个它应该返回函数,对吧?但它返回数字...似乎我不太了解函数 foo() { } ... 的提升
  • 如果你把alert()放在return之后,你应该什么都看不到;如果你把它放在前面,foo 仍然是一个数字,这就是你看到它的原因。
  • @VeryCurious 查看带有一些解释 cmets 的编辑。
【解决方案2】:

你能分享一下你想让函数 foo() 做什么吗?删除它会更新 foo 的值。

小提琴:https://jsfiddle.net/Ujwal_15/p8pdL134/6/

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

【讨论】:

    【解决方案3】:

    删除function foo() { } 有效。它发生在variable hoisting

    演示。 https://jsfiddle.net/t3ehq7h7/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多