【问题标题】:Accessing variable in another function, returns undefined - JavaScript在另一个函数中访问变量,返回未定义 - JavaScript
【发布时间】:2013-10-27 02:50:41
【问题描述】:

我正在尝试访问另一个函数中存在的变量,但我无法访问,它为我正在执行该操作的函数(getMess(),如下所示)提供了未定义的值。 根据下面的代码,我希望通过 myfunction1 访问“value1”,如下所示。 代码:

var namespace ={
    myfunction1: function(){
        namespace.myfunction2.getMess();   // I need to access value1 here in this function
    },

    myfunction2: function(message1,message2){
        var value1 = message1;
        var value2 = message2;
        return{
          getMess: function(){ return value1;}
          getLab: function() { return value2;}
        }
    }
}

namespace.myfunction2("hello","bye"); // this basically just sets the 2 values on page load

我刚刚发布了另一个关于原始问题的问题:Read resource file entry in javascript - MVC application

【问题讨论】:

  • 需要执行mufunction2才能返回函数。
  • 为什么要返回一个函数而不只是返回值?
  • @JamieHutber:这似乎是基于某种示例代码 - 我已经将这种风格的东西视为带有 JavaScript 课程的闭包示例。

标签: javascript function closures scope scoping


【解决方案1】:

你可以这样做:

myfunction2: function(message1,message2){

    var value1 = message1;
    var value2 = message2;

    namespace.myfunction2.getMess: function(){ return value1;}
    namespace.myfunction2.getLab: function() { return value2;}
}

但这很糟糕(将属性分配给函数对象)。最好使用模块模式将整个事情重构为emulate private and privileged members

例如

var namespace = (function() {

    // Private members
    var value1, value2;

    return {

      // Privileged methd to read private member values
      fn1: function() {
        return namespace.fn2.getMess1();
      },

      // Privileged methods to set and get private member values
      fn2: {
        setMess: function(message1, message2) {
          value1 = message1;
          value2 = message2;
        },

        getMess1: function() {
          return value1;
        },

        getMess2: function() {
          return value2;
        }
      }
    }
}());

namespace.fn2.setMess("hello","bye");

alert(namespace.fn1()); // hello

【讨论】:

  • 我们真的需要那个外部返回(就在声明私有成员之后),原因是,我的代码在命名空间中还有很多其他函数以及 fn1 和 fn2?此外,看起来我们正在使用全局变量 value1、value2(如果错了请纠正我),那么这真的有必要吗。本来想用全局变量的,通过它可以做到,但我不想。
  • 第一个return是必需的,它提供了分配给namespace的对象。此外,value1value2 不是全局的,它们是保存在闭包中的“私有”变量,它们只能由“特权”成员访问或修改,例如set/getMess 函数。
  • 谢谢 Rob,我现在明白了。
【解决方案2】:

这对我来说似乎很奇怪,但首先你正在重新调整一个对象,并在你试图返回的两个函数之间丢失了 ,

var namespace ={
    myfunction1: function(){
        var jamie = namespace.myfunction2("hello","bye");   // save returned value so we can use them later.
        console.info(jamie.getMess); //as we already executed the value just refer to them
    },

    myfunction2: function(message1,message2){
        var value1 = message1;
        var value2 = message2;
        return{
          getMess: function(){ return value1;}(), //return self executing functions to return values without the need to run them again.
          getLab: function(){ return value2;}()
        }
    }
}
namespace.myfunction1();

虽然我仍然不确定您要实现什么,但我将如何在 2 个函数之间传递值,同时不向 namespace 声明变量,而只是以这种方式全局分配值。

【讨论】:

  • 嗯,使用参数对 namespace.function2 的调用只能来自外部,因为我是从不同的文件 (cshtml) 调用它,而我的其余代码位于单独的 js 文件中.我将尝试总结我想要的 - 我想在 myfunction2 中设置 2 个值(调用 namespace.myfunction2 正在执行的操作),然后我希望从另一个函数(即 myfunction1)访问这些值。我不介意是否更改了整个代码,但我想实现这一点。希望澄清
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多