【问题标题】:Accessing global function variables in Javascript在 Javascript 中访问全局函数变量
【发布时间】:2011-05-31 15:02:03
【问题描述】:

不知何故,我认为您可以将函数定义为全局变量并访问其内部变量。 示例:

var func = function(){
    var connected = true;
}

console.log(func.connected);

但是,这仍然显示为“未定义”。 我认为像这样“命名空间”某些变量会很有趣。

我不想使用对象/列表/字典(您喜欢如何称呼它们),因为您可以delete 这些元素。

【问题讨论】:

  • 如果你可以delete他们呢?您也可以删除其他任何内容。
  • I don't want to use objects because you can delete those elements 很抱歉让您失望,但函数也是对象:delete func。事实上,javascript 中的一切都是对象。
  • 可以,但不能删除已使用var声明的变量

标签: javascript variables namespaces


【解决方案1】:

这是不可能的。
事实上,它甚至没有意义。
对函数的每次调用都会产生一组单独的局部变量。

您应该使用对象来创建命名空间,即使您可以delete 它们。

如果你愿意,你也可以上课:
请注意,您需要创建一个类的实例

function MyClass() { 
    this.connected = true;
}

var myInstance = new MyClass();
console.log(myInstance.connected);

但是,您不应该使用类来创建单例命名空间;没有意义。

相反,你应该写

var myNamespace = { connected: true };

console.log(myNamespace.connected);

【讨论】:

    【解决方案2】:

    var 在函数内部将其设为私有。使用this.connected = true 将其公开。

    var func = function(){
        this.connected = true;
    }
    

    PS - 据我所知,对象的所有属性都是可删除的,除非它们是不可枚举的,我认为您不能轻易指定。你应该使用this.connected,即使它是可删除的。

    有一个很好的阅读 here 关于公共/私有方法和“特权”方法。

    编辑:我假设您知道实例化.. 无论如何只需执行 x = new func 创建实例,然后执行 x.connected

    【讨论】:

    • @SLaks - 什么不起作用?我已经指定了delete 运算符。并且暗示他使用new
    • 你为什么认为new是隐含的?
    【解决方案3】:

    使用var 是私有的。

    像这样使用它:

    var func = function(){
        this.connected = true;
    }
    var namespace = new func();
    
    console.log(namespace.connected);
    

    记住它需要被实例化。

    【讨论】:

      【解决方案4】:

      您可以像这样使用 JSON 表示法:

      var func = {
         connected:true,
         func:function(){
           func.connected = true;
         }
      }
      console.log(func.connected);
      

      【讨论】:

      • 你的第二个版本可以工作,但是有太多的func s。你需要不同的名字。
      • func 太多是什么意思?为什么你需要不同的名字?为了什么? JSON 是为您的变量和函数创建单例和命名空间的完美原因。
      【解决方案5】:
      var MyClass = function() {
          function clazz() {
              this.message = "Hello"; //instance variable
          }
      
          clazz.connected = true; //static variable
      
          return clazz;
      }();
      
      
      alert(MyClass.connected)
      alert(new MyClass().message)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 2013-06-26
        • 2013-03-19
        相关资源
        最近更新 更多