在javascript中,我不应该为名称空间命名吗?
在 Google JavaScript Style Guide 的命名章节中,它说:
//Do not alias namespaces.
myapp.main = function() {
var namespace = some.long.namespace;
namespace.MyClass.staticHelper(new namespace.MyClass());
};
但我无法完全理解这个问题。为简洁起见,为什么不为名称空间命名?
答案 0 :(得分: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`
答案 1 :(得分: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
这个bug很难搜索。
别名虽然有很多好处。 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);
};
答案 2 :(得分:3)
我认为此规则仅适用于命名空间对象:
本地别名的名称应与该类型的最后一部分匹配。
你应该使用别名(参见上面的规则)是你真正想要使用的东西,在这里是MyClass
构造函数/命名空间。
改进代码:
myapp.main = function() {
var myClass = some.long.namespace.MyClass;
myClass.staticHelper(new myClass());
};
当然,这不适用于要使用其若干属性的名称空间。如果您的代码也需要namespace.TheirClass
,那就没关系。