Javascript作用域问题:变量未被识别

Javascript scope issue: variable not being identified

本文关键字:识别 变量 作用域 问题 Javascript      更新时间:2023-09-26

我有两个函数,一个函数调用另一个函数。

下面是我创建的代码结构的一个简单类比:

function test1(){
    alert(a);//a is not identified here even when test1() is called under test2 which has a defined in scope
    alert(b);//b is identified here
}
function test2(){
    var a       =       'a';//Defining a
    test1();//Calling test1()
}
var b   =   'b';
test2();

根据上面的代码,函数test1()能够识别变量b,但不能识别变量a。

我的问题是,为什么变量a不在test1函数的范围内,即使我们在定义变量a的test2()中调用test1() ?

函数在创建时记住它们的作用域链,而不是在调用时记住它们。

注意b被"提升",所以你的代码实际上是这样做的:

var b; // push b on scope chain
function test1(){ // store scope chain [b]
    alert(a);
    alert(b);
}
function test2(){ // store scope chain [b]
    var a; // push a on scope chain
    a = 'a';
    test1(); //Calling test1() which still has scope chain [b], not [b,a]
}
b   =   'b';
test2();

您对变量范围的期望是错误的,

根据你的代码,b是2个函数的全局变量,a只是在test2函数的范围内,因为它是在test2中定义的。如果你想要一些你所期望的东西,你可以在test2范围内定义test1函数,像这样,

function test2(){
    var a       =       'a';
    test1();
  function test1(){
      alert(a);
      alert(b);
   }
}
var b   =   'b';
test2();

JavaScript具有'函数作用域',这意味着在函数中定义的任何内容在函数外部都不可见。因此,变量'a'在test2之外不可见。然而,变量'b'是一个全局变量,所以它在每个作用域中都是可见的。

函数作用域也意味着内部函数可以访问外部函数中定义的东西,但这在这里不起作用…test1是test2内部从调用的,但它不是test2的内部函数。要查看实际效果,您需要在test2…

中定义test1函数的主体。
function test2(){
    var a       =       'a';//Defining a
    test1();//Calling test1()
    function test1(){
        alert(a);//a is identified here because of function scope
        alert(b);//b is identified here because it's global
    }
}

带参数调用函数是一种很好的做法。这将使您的代码易于阅读和维护。只需向函数中添加参数就可以使代码工作:

function test1(a,b){
    alert(a);
    alert(b);
}
function test2(b){
    var a = 'a';
    test1(a,b);
}
var b = 'b';
test2(b);

如果你不想在函数声明中使用参数,一个解决方案是在代码中使用arguments对象:

function test1(){
    alert(arguments[0]);
    alert(arguments[1]);
}
function test2(){
    var a = 'a';
    test1(a,arguments[0]);
}
var b = 'b';
test2(b);

如果你愿意,你可以使用默认值作为参数。因为在JavaScript中你不能在函数参数列表中这样做,所以它在函数体中完成:

function test1(a,b){
    a = a || 'a';
    b = b || 'b';
    alert(a);
    alert(b);
}
function test2(b){
    var a = 'a';
    test1(a);//here b is not passed to the function and b will get the default value
}
var b = 'some new string for b';
test2(b);

Live on jquery

根据你的函数,你已经在函数"test2()"中声明并定义了变量"a",所以变量"a"的范围被限制在该函数本身内,访问该变量将返回"undefined"。但它不是在全局声明和定义的变量"b"的情况下,所以它可以在脚本部分的任何地方访问。