javascript中嵌套函数变量作用域的澄清

Clarification on nested function variable scope within javascript

本文关键字:作用域 变量 嵌套 函数 javascript      更新时间:2023-09-26

这似乎是一个已经问过几次的话题,但我真的很难找到一个简洁的解释。我能找到的最接近的是这个(JavaScript中变量的作用域是什么?),但有几个方面我仍然不太理解。正如你可能已经猜到的,我对javascript相当陌生,但这方面似乎是至关重要的,以充分理解,如果我要得到任何地方与它。

那么考虑一个由几个嵌套函数组成的程序:

function functionA() {
    var functionAVariable = "A";
}
function functionB() {
    var functionBVariable = "B";
}
function functionC() {
    var functionCVariable = "C";
    function functionD() {
        var functionDVariable = "D";
    }
}
var globalVariable = "G";
var mainFunction = function () {
var mainFunctionVariable = "M";
    functionA();        
    functionB();
    functionC();
};

根据我的理解,所有函数都可以访问globalVariablefunctionA, functionBfunctionC可以访问mainFunctionVariable

当我们像functionD一样在整个程序中添加更深的巢时,我开始感到有点困惑。functionD是否可以访问当前包装它的所有高级函数变量,还是只能访问直接父变量functionC ?

根据我的理解,所有函数都可以访问globalVariable

正确

和functionA、functionB和functionC都可以访问mainFunctionVariable。

。只有分配给mainFunction的匿名函数才能访问mainFunctionVariable。作用域由函数创建的位置决定,而不是调用的位置。

我开始感到有点困惑的是,当我们在整个程序中添加更深的巢时,就像使用functionond一样。functionond是否可以访问当前包装它的所有高级函数变量,或者它只能访问直接父变量functionC?

函数可以访问自己作用域中和更大作用域中的所有变量(除非它们被另一个同名变量掩盖)。

var x = 1;
function a() {
  var y = 2;
  function b() {
    var z = 3;
    function c() {
      alert([x, y, z]);
    }
    c();
  }
  b();
}
a();

变量的作用域仅适用于声明该变量的函数本身。如果我们需要访问一个函数的变量到另一个函数,那么我们必须将它作为我们需要访问的函数的参数传递,否则我们必须创建全局变量,全局变量在脚本的所有函数中都是可访问的。

在上面的例子中

functionAVariable is accessible only in functionA, 
functionBVariable is accessible only in functionB and
functionCVariable is accessible only in functionC. 

functionD中不能访问functionCVariable, mainFunctionVariable只能在mainFunction中访问。mainFunctionVariablefunctionA, functionB, functionC中不可访问。

变量globalVariable在所有函数中都是可访问的。

如果你声明变量时没有指定任何datatype,比如var,那么它默认被视为全局变量。比如我们输入functionA,比如

function functionA() {
    var functionAVariable = "A";
    globVariable = 10;
}

在上面的代码片段中,functionAVariable只能在functionA中访问,但globVariable现在表现得像全局变量。