3

有没有办法在 JavaScript 中创建私有全局变量?我试着环顾四周,我不断地谈论构造函数——这似乎不太全球化。

谢谢

4

3 回答 3

4

不确定您的用例是什么。我假设您有一个包含一些函数和变量的 js 脚本文件,并且您希望全局公开其中的一些,但将其余部分保留为您的脚本文件私有。您可以通过闭包来实现这一点。基本上,您创建一个立即执行的函数。在函数内放置原始代码。然后,您将需要的函数导出到全局范围。

// Define a function, evaluate it inside of parenthesis
// and execute immediately.
(function(export) {

   var myPrivateVariable = 10;

   function myPrivateFunction(param) {
     return param + myPrivateVariable;
   }

   export.myGlobalFunction = function(someNumber) {
      return myPrivateFunction(someNumber);
   };
})(this);  // The *this* keyword points to *window* which
           // is *the* global scope (global object) in a web browser
           // Here it is a parameter - the *export* variable inside the function.

// This is executed in the global scope
myGlobalFunction(2);  // yields 12 (i.e. 2 + 10)
myPrivateVariable;    // Error, doesn't exist in the global scope
myPrivateFunction(2)  // Error, doesn't exist in the global scope
于 2012-05-12T16:17:51.900 回答
1

要回答您的问题,不,这是不可能的,因为 javascript 中没有访问修饰符。任何函数都可以访问在全局范围内声明的变量。

正如对此答案的评论中所指出的,您可以创建具有私有成员的对象。Crockford在 Javascript 中有一个关于私人成员的页面。他使用以下代码来说明他的观点:

function Container(param) {

    // private method
    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;

    // privileged method
    this.service = function () {
        return dec() ? that.member : null;
    };
}

在上面的示例中,param、secret 和它们都是私有的,因为它们不能从外部访问。更清楚地说,这些变量只能通过特权或私有方法访问,区别在于可以从对象的任何实例调用特权方法。正如评论中所建议的,这可以通过使用闭包来实现。

引用 Crockford 的关于闭包的快速解释,但你可以找到很多相关的问题

这意味着内部函数始终可以访问其外部函数的变量和参数,即使在外部函数返回之后也是如此。

于 2012-05-12T15:28:27.270 回答
0

为了拥有私人成员。你需要使用闭包。

以下代码可帮助您理解该概念。

function CustomArray () {
    this.array = [];

    var privateData = 'default data';
    this.getPrivateData = function () {
        return privateData;
    };
    this.setPrivateData = function (data) {
        privateData = data;
    }; 
};

CustomArray.prototype.push = function (data) {
    this.array.push(data);
};

CustomArray.prototype.unshift = function (data) {
    this.array.unshift(data);
};

CustomArray.prototype.pop = function () {
    this.array.pop();
};

CustomArray.prototype.shift = function () {
    this.array.shift();
};

CustomArray.prototype.print = function () {
    console.log(this.array.join(','));
};

var array = new CustomArray();

array.push(10);
array.push(20);
array.push(30);
array.push(5);

array.unshift(3);
array.unshift(2);
array.unshift(1);
array.unshift(0);

array.pop();
array.shift();

array.print();
console.log(array.getPrivateData());// default data 
array.setPrivateData('am new private data');
console.log(array.getPrivateData());//am new private data
于 2018-05-26T18:55:43.197 回答