10

在javascript中,我不应该给命名空间起别名吗?

Google JavaScript Style Guide的命名章节中,它说:

//Do not alias namespaces.
myapp.main = function() {
  var namespace = some.long.namespace;
  namespace.MyClass.staticHelper(new namespace.MyClass());
};

但我不能完全理解这个问题。为简洁起见,为什么不给命名空间起别名?

4

3 回答 3

6

您更改this,这可能会破坏别名命名空间中的函数。例子:

var foo = {
    bar: function () {
        console.log(this.baz);
    },
    baz: 42
};

foo.bar(); // prints 42
var alias = foo.bar;
alias(); // prints undefined, because `this` is no longer `foo`
于 2012-08-01T13:23:56.403 回答
3

该文档明确表示您应该在本地别名长命名空间类型:

如果这样做可以提高可读性,请为完全限定类型使用本地别名。本地别名的名称应与类型的最后部分匹配。

但是,除了参考安全之外,我无法想象为什么你不应该给命名空间起别名

别名命名空间的问题是引用不再指向相同的实例。

my.long.namespaces.myFunc()
// this refers to the same function, but is a different reference
var myLocalNamespace = my.long.namespace;
namespace.myFunc();
// and you can easily introduce bugs which are hard to find
myLocalNamespace.myFunc = "foobar";
myLocalNamespace.myFunc()  // throws a type error because myFunc is now a string

这个错误很难搜索。

不过,别名有很多好处。JavaScript 中的每个成员查找都需要时间。因此,拥有不断需要查找成员链的代码是在浪费速度。由于本地的成本var可以忽略不计,因此强烈建议您在引用长名称空间、函数结果(如$("something"))等时使用本地变量。此外,它使您的代码更具可读性。考虑以下:

var handleNamespace = function() {
    my.really.long.namespace.foo = "bar";
    my.really.long.namespace.doIt(my.really.long.namespace.foo);
    my.really.long.namespace.member = my.really.long.namespace.somethingElse(my.really.long.namespace.addOne(2));
};

如您所见,这很快就会变得混乱。摆脱重复代码可以节省处理能力并使您的代码更具可读性。

var handleNamespace = function() {
    var namespace = my.really.long.namespace,
        three = namespace.addOne(2);

    namespace.foo = "bar";
    namespace.doIt(namespace.foo);
    namespace.member = namespace.somethingElse(three);
};
于 2012-08-01T13:39:38.727 回答
3

我认为这条规则仅适用于命名空间对象:

本地别名的名称应与类型的最后部分匹配。

你应该使用别名(参见上面的规则一)是你真正想要使用的东西,在这里是MyClass构造函数/命名空间。

改进的代码:

myapp.main = function() {
  var myClass = some.long.namespace.MyClass;
  myClass.staticHelper(new myClass());
};

当然,这不适用于您要使用其多个属性的名称空间。如果您的代码也需要namespace.TheirClass,那就可以了。

于 2012-08-01T13:40:18.837 回答