【问题标题】:Javascript scope: passing a variable from an outer function to an inner functionJavascript范围:将变量从外部函数传递到内部函数
【发布时间】:2012-10-14 20:40:44
【问题描述】:

我在outerFunction 中定义了变量“a”。我想在我的 innerFunction 中使用它。为什么这不起作用,在嵌套函数之间传递数据的最佳方式是什么?

var outerFunction = function () {
   var a = 5;
   innerFunction();
}


var innerFunction = function () {
   alert(a);
}

outerFunction();

【问题讨论】:

标签: javascript jquery oop variables scope


【解决方案1】:

你必须向内部函数添加参数并从外部函数传递值。

Live Demo

var outerFunction = function () {
   var a = 5;
   innerFunction(a);
}


var innerFunction = function (a) {
   alert(a);
}

outerFunction();

【讨论】:

    【解决方案2】:

    innerFunction 不是 outeFunction 的内部函数,您只是从 outerFunction 调用它。 内部函数应该定义如下。

    var outerFunction = function () {
       var a = 5;
       var innerFunction = function () {
        alert(a);
       }
       innerFunction();
    }
    

    【讨论】:

    • 我担心如果我开始在函数中定义函数,我的脚本很快就会失去任何模块化,而只是一个函数的链。有没有更模块化的方式来做到这一点?
    • 您应该在同一级别上创建函数。但在其他答案中已经建议在被调用函数中传递参数。上面我展示了如何创建内部函数。
    【解决方案3】:

    在 javascript 中,函数被绑定到它们的上下文中。这意味着在outerFunction 中定义的变量只存在于那里,而不存在于全局上下文中。但对于函数innerFunction,此范围不可用。所以你不能访问它。如果你需要它,你应该将它作为参数传递给innerFunction

    【讨论】:

      【解决方案4】:

      实际上嵌套它们:

      var outerFunction = function () {
      
          var innerFunction = function () {
              alert(a);
          }
      
          var a = 5;
          innerFunction();
      }
      
      outerFunction();
      

      现在innerFunction 的范围(alert 有权访问)位于声明了aouterFunction 的范围内。

      【讨论】:

      • 虽然这可行,但请不要这样做,范围共享可能难以调试,请改用参数。
      • @DustyJ:嗯?闭包有什么问题?此外,嵌套它们是获得“内部”和“外部”功能的唯一方法。
      【解决方案5】:

      var 定义变量的局部范围。如果你不打算传递变量,那就这样做吧,

      var outerFunction = function () {
         a = 5;
         innerFunction();
      }
      
      
      var innerFunction = function () {
         alert(a);
      }
      
      outerFunction();
      

      但干净的方法是传入变量

      innerFunction(a)
      

      【讨论】:

      • 污染全局范围不是解决办法。
      • 我不明白这里的否决票。我已经提到,如果您不打算传入变量。我认为这对这个人来说也是一个很好的学习,并且知道 var 的重要性
      • 你忘了说这样做真的很糟糕。
      • 接受你说?你知道一个问题只能接受一个答案,应该选择最好的吗?
      • 投反对票,使用全局范围是最坏的做法,永远不应该使用。
      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2022-01-17
      • 2019-10-05
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多