我可以在函数内定义一个javascript变量(不是全局变量),并且这个变量在他的范围之外是可见的吗?

时间:2015-11-12 19:06:00

标签: javascript variables scope

我需要在函数内部定义一个变量,这个变量必须在原始范围内可见,并且上面有一个范围(它与全局变量不同)。

可以在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

}

6 个答案:

答案 0 :(得分:2)

使用ES6可以阻止这些功能的范围。这给出了在特定块中定义的“全局”变量,并使其可以访问此范围中定义的函数。

{
    let var1 = 10;
    function one() {
        //...
    }
    function two() {
        //...
    }
}

这使您可以对范围进行简单有效的控制,尤其是在提升和功能方面。

编辑您的编辑:除非您将var2作为参数传递给函数,否则没有办法将其范围限定为2个函数而没有某种上层范围。 Aka,firstFunction不能访问var2(再次,除非参数化),而mainFunction没有范围。

答案 1 :(得分:0)

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

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

意味着var2无法访问secondFunction()

答案 2 :(得分:0)

它会像您在代码中对其进行评论一样工作。函数范围不会传播到全局范围。

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

var var1, var2;

答案 3 :(得分:0)

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

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

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

......但当然这是一种花哨的方式。

答案 4 :(得分:0)

在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();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

答案 5 :(得分:-2)

使用

window.var1
window.var2

代替