Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在函数中定义一个javascript变量(不是全局变量)并且该变量在其作用域之外可见吗?_Javascript_Variables_Scope - Fatal编程技术网

我可以在函数中定义一个javascript变量(不是全局变量)并且该变量在其作用域之外可见吗?

我可以在函数中定义一个javascript变量(不是全局变量)并且该变量在其作用域之外可见吗?,javascript,variables,scope,Javascript,Variables,Scope,我需要在函数中定义一个变量,这个变量必须在其原始范围和上面的一个范围内可见(它与全局变量不同) 这在javascript中是可能的吗 例如 function mainFunction () { function firstFunction() { var var1 = 10; secondFunction(); console.log(var2); // must be 20 (must be undefined one scope above f

我需要在函数中定义一个变量,这个变量必须在其原始范围和上面的一个范围内可见(它与全局变量不同)

这在javascript中是可能的吗

例如

function mainFunction () {

    function firstFunction() {
      var var1 = 10;
      secondFunction();
      console.log(var2); // must be 20 (must be undefined one scope above  firstFunction())
      console.log(var1); // must be 10 (of course)
    }

    function secondFunction() {
      var var2 = 20;
      console.log(var2); // must be 20 (of course)
      console.log(var1); // must be undefined
    }

    firstFunction();

    console.log(var2); // must be undefined
    console.log(var1); // must be undefined

}
使用

相反

secondFunction()
超出了
firstFunction()
的范围,因此您的评论

// must be 20 (must be undefined outside firstFunction() scope)

这意味着
var2
永远无法访问
secondFunction()

使用ES6您可以阻止这些函数的作用域。这将给出在特定块中定义的“全局”变量,并使在此范围内定义的函数可以访问该变量

{
    let var1 = 10;
    function one() {
        //...
    }
    function two() {
        //...
    }
}
这使您能够简单有效地控制范围,尤其是在起重和功能方面


编辑到您的编辑:除非您将
var2
作为参数传递给函数,否则如果没有某种更高级别的作用域,就无法将其作用域限定为2个函数。也就是说,如果main函数没有作用域,firstFunction就不能访问var2(同样,除非参数化)。它的工作方式就像您在代码中对它进行了注释一样。函数作用域不会传播到全局作用域

为什么不在顶部声明变量呢

var var1, var2;

例如,一种可能是使用静态变量

function firstFunction() {
    firstFunction.var1 = 10;
}

// you can access firstFunction.var1 outside the firstFunction()

…但这当然是一种噱头。

在javascript中,私有变量可以通过闭包访问。闭包是一个可以访问父作用域的函数,即使在父函数关闭之后也是如此

function mainFunction () {

    function firstFunction() {
       var var1 = 10;
       var var2 = secondFunction();
       console.log(var2); // must be 20 
       console.log(var1); // must be 10 (of course)
    }

    function secondFunction() {
        var var2 = 20;
      console.log(var2); // must be 20 (of course)
      return var2;
    }

    firstFunction();

   // console.log(var2); // must be undefined
   // console.log(var1); // must be undefined

}

mainFunction();

您的代码缺少
var
所以这些都是全局代码,但您的问题的答案是“否”。Pointy所说的在这里是准确的。所有(目前已有6或7个)答案都不正确和/或不适用于您的问题。谢谢。如果修正了变量声明。对不起。我的意思是:“必须在firstFunction()上定义一个作用域。”。谢谢,我修好了。对不起,我的坏。。。我试着做一个代码块注释,但我对这个还是有点陌生,你能解释一下吗?我是ES6新手,所以我很想知道哪里出了问题。OP特别要求不要将其纳入全球范围。附加到
窗口
就可以做到这一点。
function mainFunction () {

    function firstFunction() {
       var var1 = 10;
       var var2 = secondFunction();
       console.log(var2); // must be 20 
       console.log(var1); // must be 10 (of course)
    }

    function secondFunction() {
        var var2 = 20;
      console.log(var2); // must be 20 (of course)
      return var2;
    }

    firstFunction();

   // console.log(var2); // must be undefined
   // console.log(var1); // must be undefined

}

mainFunction();