Javascript命名空间和私有变量

时间:2014-07-10 14:23:45

标签: javascript scope

我在HTML5 / javascript / css

的培训指南中看到了以下示例

我不明白为什么方法中的私有变量被添加为底层对象/名称空间ns中的私有变量。

(function () {
   this.myApp = this.myApp || {};
   var ns = this.myApp;
   var vehicleCount = 5;
   var vehicles = new Array();
   ns.Car = function () { }
   ns.Truck = function () { }
   var repair = {
   description: 'changed spark plugs',
   cost: 100
   };
}());

这是本书给出的解释:

IIFE(发音为iffy)是一个匿名函数表达式,在其末尾有一组括号,表示您要执行该函数。匿名 函数表达式包含在括号中,告诉JavaScript解释器函数不仅被定义;它也在加载文件时执行。 在这个IIFE中,第一行创建了myApp命名空间(如果它尚不存在) 表示用作命名空间的单例对象。接下来,创建一个ns变量(用于命名空间)作为命名空间的别名,以便在IIFE中保存输入,因此ns可以 用来代替this.myApp。之后,定义名称空间的私有成员 通过使用var关键字。汽车和卡车是公共的,因此它们以ns为前缀。

如果他们想要使myApp'命名空间'

的这些属性私有,我希望使用以下代码
(function () {
   this.myApp = this.myApp || 
      {
         var ns = this.myApp;
         var vehicleCount = 5;
         var vehicles = new Array();
         var repair = {
            description: 'changed spark plugs',
            cost: 100
            };
      };
   ns.Car = function () { }
   ns.Truck = function () { }
}());

1 个答案:

答案 0 :(得分:1)

它们是私有的,因为它们在闭包中定义并完全封装为闭包内的局部变量。 ns也成为局部变量。关闭之外没有参考范围。

这是一个自调用闭包,定义的范围类似于在“普通”函数中定义局部变量。