JavaScript基础混乱

pra*_*pks 4 javascript

嗨,我想了解JavaScript的基本原理,并陷入一个条件.

    var foo = 1;
    function bar(){
        foo = 10;       
        return;
        function foo(){}
    }
    bar();
    alert(foo);
Run Code Online (Sandbox Code Playgroud)

在这里alert(foo),会给我1,并且我知道在return语句之后,函数foo()将不会执行.但是现在如果改变代码:

    var foo = 1;
    function bar(){
        foo = 10;       
        return;
    }
    bar();
    alert(foo); 
Run Code Online (Sandbox Code Playgroud)

在条形函数中,如果我将删除函数foo().然后alert(foo)会给我10

请帮忙,如果有人能解释我为什么?

Raj*_*ddy 8

这称为Javascript提升

我将尝试详细解释它.这就是我们所拥有的

var foo = 1;

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

bar();
alert(foo);
Run Code Online (Sandbox Code Playgroud)

解释器会将其重写为

var foo = 1;

function bar(){
  function foo(){}  // this is also equal to var foo = function(){};
  foo = 10;       
  return;      
}

bar();
alert(foo);
Run Code Online (Sandbox Code Playgroud)

所以现在向你解释提升的代码.

var foo = 1; // global variable; 

function bar(){
  var foo = function(){};  // foo is local variable of type function
  foo = 10;                // foo is changed to hold a number
  return;      
}

bar();
alert(foo);  // you alert global variable.
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果代码function foo(){}存在,它将被视为bar()范围内的局部变量,并且对该代码的任何更改都将foo被视为局部变量更改.

  • 当你 function foo(){}你的bar(),你甚至没有触及全局变量..因此提醒1.

  • 如果没有 function foo(){},则触摸全局变量,从而发出警报10.

    现在我希望你理解输出..

  • 值得一提的是,像`foo = function(){};`这样的函数表达式没有被提升到作用域的开头,所以它们在它们出现在代码之前就不能使用了,这意味着如果你做`function bar(){ foo = 10; 返回; foo = function(){}}`foo将返回10 (2认同)

Que*_*tin 5

我知道在 return 语句之后,函数 foo() 将不会执行。

这不是真的。

函数声明被提升。

function foo(){}创建一个名为的局部变量foo(将新函数分配给它),然后foo = 10覆盖它。但你永远不会测试该变量的值foo

在 bar 函数中,如果我将删除函数 foo()。然后alert(foo)会给我10

您不再调用局部变量,foo因此您将覆盖同名的全局变量。


比较:

(function() {
  console.log("Version 1");
  var foo = 1;

  function bar() {
    console.log("At top of bar, foo is " + foo);
    foo = 10;
    console.log("After assignment in bar, foo is " + foo);
    return;

    function foo() {}
  }
  bar();
  console.log("Global foo is " + foo);
}());

(function() {
  console.log("Version 2");
  var foo = 1;

  function bar() {
    console.log("At top of bar, foo is " + foo);
    foo = 10;
    console.log("After assignment in bar, foo is " + foo);
    return;
  }
  bar();
  console.log("Global foo is " + foo);
}());
Run Code Online (Sandbox Code Playgroud)