返回

剖析私有变量与全局变量:作用域链帮你斩获一道编程题

前端

把握JS变量生命线——理清全局与私有,作用域链助你攻克一道题

在JavaScript的世界里,变量是用来存储数据的容器。它们可以被赋予各种不同的值,比如数字、字符串、数组甚至函数。变量可以是私有的,也可以是全局的。私有变量的作用域仅限于它被声明的代码块,而全局变量的作用域则遍及整个程序。

那么,如何区分私有变量和全局变量呢?记住以下两点,即可拨开迷雾:

  1. 在私有作用域中,只有以下两种情况是私有变量:

    • 声明过的变量(带var/function)
    • 形参也是私有变量
  2. 剩下的都不是私有变量,都是全局变量。

现在,让我们通过一道编程题来检验你的理解程度:

var a = 10;
function test() {
  var b = 20;
  console.log(a); // 10
  console.log(b); // 20
}
test();
console.log(a); // 10
console.log(b); // ReferenceError: b is not defined

这道题考察的是你对作用域的理解。作用域链是指一个函数在其执行过程中可以访问的所有变量的环境集合。作用域链是从内到外依次排列的,最内层的环境是当前函数的作用域,最外层的环境是全局环境。

在这个例子中,变量a是全局变量,因此它可以在任何地方访问。变量b是私有变量,因为它是在函数test()中声明的。因此,它只能在函数test()中访问。

当你调用函数test()时,作用域链会发生变化。最内层的环境是函数test()的作用域,最外层的环境仍然是全局环境。这意味着在函数test()中,你可以访问变量ab

当你执行console.log(a)时,它会输出10,因为变量a是全局变量,可以在任何地方访问。当你执行console.log(b)时,它会输出20,因为变量b是在函数test()中声明的,因此它只能在函数test()中访问。

当你调用函数test()后,作用域链会恢复到之前的状态。最内层的环境是全局环境,最外层的环境仍然是全局环境。这意味着在函数test()之外,你只能访问变量a,而无法访问变量b

当你执行console.log(a)时,它会输出10,因为变量a是全局变量,可以在任何地方访问。当你执行console.log(b)时,它会输出ReferenceError: b is not defined,因为变量b是在函数test()中声明的,因此它只能在函数test()中访问。

希望通过这篇文章和编程题,你能对私有变量和全局变量、作用域链有一个更深入的理解。祝你在前端开发的道路上越走越远,越走越精彩!