我应该在javascript中使用私有变量吗?

时间:2015-04-12 03:39:20

标签: javascript closures

我最近发现here有一种方法可以让类中的变量在Javascript中完全私有,这意味着无法通过点运算符访问。

它的工作原理如下:JSFIDDLE

function PrivateRuns(startOff) {// make an object
    function getRuns() {// private function used to get private variables
        privateRuns -= 1; // accessable with "out" because in same scope
        privateRuns = Math.max( privateRuns, 0);
        return privateRuns + privateHits;
    }

    var privateRuns = startOff;
    var privateHits = 6;

    this.setRuns = function(val){ privateRuns = Math.max(val, 0); };
    this.getAction = function () {// this function is of scope "this"
        //out.privateHits = out.privateHits + 1;
        return ( "runs n hits:  "+ getRuns() +"   "  );
    };
}
var myRuns = new PrivateRuns(10);

myRuns.privateRuns = -10;// does not work
//myRuns.setRuns(-10);// DOES work
for( var i = 0; i < 10; i ++ ){
     $("HTML").append(  myRuns.getAction() +"<br>" );
}

现在我知道如果使用得当,这有很多好处,但是真的有必要吗?我在教程中很少见过这个,我不能说我在开源项目中亲自寻找过这个。

关于此,

  1. 这实际上是一个错误吗? (我读过的网站提到它是&#34; hack&#34;)
  2.   

    这是ECMAScript语言规范中的错误的一种解决方法,导致内部函数的设置不正确。

    1. 这是一种常见的做法,为什么或为什么不呢?

1 个答案:

答案 0 :(得分:0)

您可能想要使用“私有”变量的一个原因是您正在开发一个将被其他人使用的库。您可以封装所有私有变量,函数等,并将公共API公开到库中。这样可以将您的库包含在页面中,而不必担心任何变量名称与页面上的其他变量冲突。举个例子:jQuery。您可以通过变量名jQuery或$访问所有公共API。这意味着只有变量jQuery和$已添加到您的页面中,因此您可以自由使用您想要的任何其他变量名称,而不必担心与jQuery冲突。私有变量允许您根据需要在库中实现内容,而无需担心页面上的某些代码会故意或意外地改变预期的行为。

这不是一个错误,它只是变量在JavaScript中作用域的方式的副作用

查看立即调用的函数表达式的概念,作为私有变量和函数可能有用的示例用例(http://benalman.com/news/2010/11/immediately-invoked-function-expression/)。有很多例子在JavaScript中使用私有变量 - 如前所述,jQuery等JavaScript库广泛使用它们。