【问题标题】:Javascript namespace and private variablesJavascript 命名空间和私有变量
【发布时间】:2014-07-10 14:23:44
【问题描述】:

我在 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 关键字。 Car 和 Truck 是公共的,因此它们以 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 () { }
}());

【问题讨论】:

标签: javascript scope


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2014-07-05
    • 2017-01-04
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多