【问题标题】:Setting a Javascript Private Variable with the same name as a Function Parameter?设置与函数参数同名的Javascript私有变量?
【发布时间】:2011-06-27 04:04:31
【问题描述】:
function Foo() {
    var myPrivateBool = false,
        myOtherVar;
    this.bar = function(myOtherVar) {
        myPrivateBool = true;
        myOtherVar = myOtherVar; // ?????????????????
    };
}

如何设置私有变量 myOtherVar?

【问题讨论】:

    标签: javascript private javascript-objects


    【解决方案1】:

    给参数一个不同的名字:

        function Foo() {
            var myPrivateBool = false,
                myOtherVar;
            this.bar = function( param ) {
                myPrivateBool = true;
                myOtherVar = param;
            };
            this.baz = function() {
                alert( myOtherVar );
            };
        }
    
    
    var inst = new Foo;
    
    inst.bar( "new value" );
    
    inst.baz();  // alerts the value of the variable "myOtherVar"
    

    http://jsfiddle.net/efqVW/


    如果您愿意,也可以创建一个私有函数来设置值。

    function Foo() {
        var myPrivateBool = false,
            myOtherVar;
        function setMyOtherVar( v ) {
            myOtherVar = v;
        }
        this.bar = function(myOtherVar) {
            myPrivateBool = true;
            setMyOtherVar( myOtherVar );
        };
        this.baz = function() {
            alert(myOtherVar);
        };
    }
    
    
    var inst = new Foo;
    
    inst.bar("new value");
    
    inst.baz();
    

    http://jsfiddle.net/efqVW/1/

    【讨论】:

    • 我怕是这样=(我猜这是js的一个缺陷
    • @Garrett:是的,bar 函数中的形参在作用域链中会比构造函数的变量更接近。
    • @Garrett:我想你可以创建一个私有函数来设置值,但我不确定这就是你想要的。
    • 不,只是寻找最干净的代码。制作另一个函数来设置私有成员会让我保留参数名称,但这太麻烦了。谢谢!
    【解决方案2】:

    在 JavaScript 中,在私有变量的名称前加上 _(下划线)是一种惯例。 按照此约定,您可以将代码更改为。

    function Foo() {
        var _myPrivateBool = false,_myOtherVar;
        this.bar = function(myOtherVar) {
            _myPrivateBool = true;
            _myOtherVar = myOtherVar;
        };
    }
    

    在上面的代码中,我们将局部变量 myOtherVar 分配给私有变量 _myOtherVar。 这样看来,我们的私有变量和局部变量的名称是相同的。

    注意:这只是一个约定。使用 _ 为变量名添加前缀不会使其成为私有变量。

    【讨论】:

      【解决方案3】:

      我认为 this.myOthervar = myOtherVar;将破坏全局命名空间并在窗口对象中创建一个变量 window.myOtherVar

      【讨论】:

      • OP 使用Foo 作为构造函数,因此当构造函数被调用(作为构造函数)时,this 将引用正在创建的新对象。
      【解决方案4】:

      试试this.myOtherVar = myOtherVar;

      【讨论】:

      • 设置属性,而不是变量。
      • 这不是让它成为公共成员吗?
      【解决方案5】:

      也许您可以将 myOtherVar 声明为 MyOtherVar,利用 javascript 的大小写敏感性,然后将 MyOtherVar=myOtherVar 分配给函数:

      function Foo() {
          var MyPrivateBool = false,
              MyOtherVar;
          this.bar = function(myOtherVar) {
              MyPrivateBool = true;
              MyOtherVar = myOtherVar;
          };
      }
      

      【讨论】:

      • 这是一个不好的做法,因为大写的名称是按照约定的类,例如:对象、日期、数学、人、车辆等。
      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2011-10-11
      • 2012-06-27
      • 1970-01-01
      • 2015-09-30
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多