当前位置: 首页 > 知识库问答 >
问题:

javascript中的变量作用域混乱[重复]

费秦迟
2023-03-14

我在研究JS中变量作用域的概念时,在上面发现了这个例子:

(function() {
    var foo = 1;
    function bar() {
        var foo = 2;
    }
    bar();
    console.log(foo) //outputs 1
    if(true) {
        var foo = 3;
    }
    console.log(foo) //outputs 3
})();

函数的输出为

1 
3

现在我很困惑,为什么foogets会在第二个日志中获得值3。即使在if语句中使用var声明foo时也是如此。在if中声明的foo不是应该在bar()中获得一个新实例吗?

共有2个答案

松桐
2023-03-14

if不引入作用域块(我理解在某些语言中会引入作用域块)。在JavaScript中,只有function(){}创建作用域块。

宇文念
2023-03-14

JavaScript中只有两种作用域;函数作用域和全局作用域。

if语句内部的代码没有自己的作用域,因此if语句内部的变量与其外部的变量相同。

在作用域中多次声明变量不会创建多个变量。忽略if语句中的var关键字,因为变量已经在作用域中声明过一次,所以它只是一个赋值。

还要注意,变量的声明被提升到作用域的顶部,因此即使声明在未执行的代码块内,变量仍然被创建:

var foo = 1; // a global variable
(function() {
  console.log(foo) //outputs "undefined"
  foo = 2; // sets the local variable
  if(false) {
    var foo = 3; // creates the local variable, but the assignment never happens
  }
  console.log(foo) //outputs 2
})();
console.log(foo) //outputs 1
 类似资料:
  • 我对JavaScript作用域有相当的了解--该语言具有函数级作用域,变量和函数声明被提升到其包含作用域的顶部。但是,我想不通为什么下面两段代码记录了不同的值: 这会将值1记录到控制台: 神秘的是,这记录了10: 那引擎盖下面是怎么回事?

  • 问题内容: 我对背后似乎是不一致的原因感到困惑。 例如 因此,将按预期打印出0。但是说我们有这个 抱怨a尚未初始化,因此无法为我编译。我期望它能打印出0 … 这使我想到了一些问题: 1)为什么作用域变量没有默认值? 2)请问static关键字是原因吗?又为什么呢 问题答案: Java语言规范解释了变量的默认初始值 每个类变量,实例变量或数组组件在创建时都会用默认值初始化(第15.9节,第15.10

  • 本文向大家介绍Javascript变量的作用域和作用域链详解,包括了Javascript变量的作用域和作用域链详解的使用技巧和注意事项,需要的朋友参考一下 工作这几年,js学的不是很好,正好周末有些闲时间,索性买本《js权威指南》,大名鼎鼎的犀牛书,好好的把js深入的看一看。买过这本书的第一印象就是贼厚,不过后面有一半部分都是参考手册。 一:作用域   说起变量第一个要说到的肯定就是作用域,正是因

  • 本文向大家介绍JavaScript 变量、作用域及内存,包括了JavaScript 变量、作用域及内存的使用技巧和注意事项,需要的朋友参考一下 JS变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已; 由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变; 一 变量及作用域 1.基本类型和引用类型 // JS变量包含

  • 变量作用域 在javascript中,用关键字var声明的变量是有作用域的。 1、如果变量是在函数内部声明的,则该变量的作用域为整个函数体,在函数外部不可引用该变量。 function abs () { var x = 1; //在函数内部声明变量 x = x * 2; } x = x * 4; //报错,函数外部不能引用在函数内部声明的变量 2、如果两个不同的函数声明了相同

  • 变量作用域 变量的作用域值的是变量的生命周期和作用范围(全局与局部作用域的区别)。 作用域介绍 静态作用域 静态作用域有称为词法作用域,即指其在编译的阶段就可以决定变量的引用。静态作用域只更变量定义的位置有关与代码执行的顺序无关。 var x = 0; function foo() { alert(x); } function bar() { var x = 20; foo(); }