以下代码中的输出如何成为1可以解释一下吗?

时间:2016-08-04 09:13:19

标签: javascript jquery

以下代码中的输出如何变为1可以解释一下吗?

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

3 个答案:

答案 0 :(得分:1)

您已经定义了一个具有相同名称foo的函数,因此在方法foo内(充当局部变量)引用函数。您可以在console.log(foo)方法中看到bar()作为函数。

var foo = 1;

function bar() {
  console.log(foo);
  foo = 10;
  return;

  function foo() {}
}
var b=bar();
alert(foo);

您可以做的是在全局上下文中获取变量(window['foo'])并更新或重命名变量或函数。

var foo = 1;

function bar() {
  window['foo'] = 10;
  return;

  function foo() {}
}
var b=bar();
alert(foo);

答案 1 :(得分:0)

Var hoisting 是根据Mozilla Developer Network as mention here...

在java脚本中使用的一种技术

其中说..

  

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

所以当你宣布function foo() {}时  在function bar() {...}内,它被视为局部变量,因此它的值在bar()之外被销毁。

下面是产生相同行为的代码:

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

你的代码只是将变量foo声明为方法。

答案 2 :(得分:0)

请参阅console.log:



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




JavaScript解释器始终将函数声明和函数变量移动('hoisted')到JavaScript范围的顶部。

所以它更像这样:



var foo = 1;

function bar() {
  function foo() {}
  console.log(foo);
  foo = 10;
  return;
  //function foo() {}
}
var b=bar();
alert(foo);



 所以bar中的foo是一个局部变量,并且被10覆盖。并且全局foo不会受到影响。 所以foo是1.

您可以参考此enter link description here