Javascript-变量提升

Javascript-变量提升,javascript,Javascript,这是一个简单的片段,我只是不明白的东西 下面的代码输出12,我理解,因为var foo=12替换变量的先前声明 <script> var foo = 1; function bar(){ if (!foo) { var foo = 12; } alert(foo); } bar(); </script> var-foo=1; 功能条(){ 如果(!foo){ var-foo=12; } 警报(foo); } bar(); 在下面的代码中,它警告1

这是一个简单的片段,我只是不明白的东西

下面的代码输出12,我理解,因为
var foo=12替换变量的先前声明

<script>
var foo = 1;
function bar(){
  if (!foo) {
    var foo = 12;
  }
  alert(foo);
}
bar();
</script>

var-foo=1;
功能条(){
如果(!foo){
var-foo=12;
}
警报(foo);
}
bar();
在下面的代码中,它警告1,这意味着在函数外部声明的变量可以在函数内部访问

  <script>
    var foo = 1;
    function bar(){
      alert(foo);
    }
    bar();
    </script>

var-foo=1;
功能条(){
警报(foo);
}
bar();
但是,在下面的代码中,为什么警告未定义??我想,它会提醒1,我只是将先前声明的变量分配给新变量

  <script>
    var foo = 1;
    function bar(){
      if (!foo) {
        var foo = foo;
      }
      alert(foo);
    }
    bar();
    </script>

var-foo=1;
功能条(){
如果(!foo){
var foo=foo;
}
警报(foo);
}
bar();

变量声明被推送到函数的开头

  <script>
    var foo = 1;
    function bar(){
      alert(foo);
    }
    bar();
    </script>
因此,在现实中,以下情况正在发生:

function bar(){
      var foo;
      if (!foo) {
        foo = foo;
      }
      alert(foo);
}
因此,您需要将其更改为使用
window.foo
,以便引用全局属性而不是函数的属性:

var foo = 1;
function bar(){
   var foo;
   if (!window.foo) {
      foo = window.foo;
   }
   alert(foo);
}
bar();

吊装有点棘手。函数声明与函数赋值一起提升,但是变量声明在没有变量赋值的情况下提升。所以代码的执行顺序实际上是:

var foo;
var bar = function bar(){
  var foo; // undefined
  if (!foo) { // true
    foo = foo; // foo = undefined
  }
  alert(foo);
}
foo = 1;
bar();
如果要引用全局变量
foo
,可以使用
window.foo
,或者使用其他变量名:

var foo = 1;
function bar(){
  var baz =  foo;
  alert(baz);
}
bar();
下面的代码输出12,我理解,因为var foo= 12; 替换先前的变量声明

<script>
var foo = 1;
function bar(){
  if (!foo) {
    var foo = 12;
  }
  alert(foo);
}
bar();
</script>
你是对的,因为局部变量覆盖了全局变量

在下面的代码中,它向1发出警报,即声明的变量 函数外部可在函数内部访问

  <script>
    var foo = 1;
    function bar(){
      alert(foo);
    }
    bar();
    </script>
你说得对
foo
在全局范围内声明,因此可以从任何位置访问

但是,在下面的代码中,为什么警告未定义??我想会的 警报1,我只是将先前声明的变量赋值给 新的

这有点不同。您正在用相同的名称声明一个全局变量和一个局部变量。当JavaScript程序执行进入一个新函数时,函数中任何位置声明的所有变量都会移动(或提升或提升)到函数的顶部

  <script>
    var foo = 1;
    function bar(){
      alert(foo);
    }
    bar();
    </script>
另一个例子:

var a=123;
函数f(){
var a;//与:var a=未定义相同;
警报(a);//未定义
a=1;
警告(a);//1
}

f()IMHO它与函数声明和提升无关

在函数内部用
var
声明变量在函数的隔离作用域中创建变量时,这就是未定义变量的原因

 var foo = 1;
 function funcOne() {
     var foo = foo;
     alert('foo is ' + foo);
 };
 funcOne();

 var bau = 1;
 function funcTwo() {
     bau = bau;
     alert('bau is ' + bau);
 };
 funcTwo();

在javascript中,在ES5规范之前,范围仅在函数体中实现。块作用域的概念不存在()

所以,如果你声明一个变量
var某物从函数体外部,它将是全局的(在浏览器中,全局范围是窗口对象的范围)

  • 全局变量
  • var something='Hi-Man';
    /**
    *这等于:
    **/
    
    window.something='Hi-Man'使用
    var foo=window.foo
    如果(!foo){
    检查全局变量
    foo
    ,但在
    if
    语句中,您正试图用另一个
    foo
    更改此全局变量值,而在
    if
    语句中,则未定义,函数表达式也会发生同样的情况。明白了:)学到了一些新的东西(thanx:)这是一个很好的例子,thanx:)