2

我是一名熟练的 C/C++ 程序员,必须在 javascript 中实现 firefox 扩展(一种对我来说非常不愉快且不直观的语言)。我有扩展基础工作,但现在我需要将所有全局变量和函数放入一个命名空间中,以确保我的变量名或函数名都不会与任何过去/现在/未来的全局/窗口对象中可能存在的名称冲突,或在另一个扩展中。

用我的全局变量创建一个命名空间对象似乎很简单,而且很有效。

我无法理解的是如何将我的函数声明放入命名空间对象中,然后在命名空间对象声明下实现所有这些函数。这可以通过一些相当干净的语法来完成......类似于以下内容?

//
// declare namespace
//
var mynamespace = {
  varname00: value,
  varname01: value,
  varname02: value,
  function: funcname00(),
  function: funcname01(number),
  function: funcname02(number, string),
};
//
// define functions
//
mynamespace.funcname00() {
  return (23);
}

mynamespace.funcname01(number) {
  return (number * number);
}

mynamespace.funcname02(number, string) {
  econsole.logStringMessage("funcname02() : " + string + number);
  return (number);
}

注意:我的目标不是变得棘手或先进——恰恰相反!我正在寻找一种对 C 程序员尽可能直观的技术!因此,我更喜欢:

1:在顶部创建一个命名空间对象的小声明,只声明变量和函数。

2:实现全局命名空间对象之外的功能。

完全被 javascript 语法规则弄糊涂了,我猜 javascript 可能会让我在命名空间对象声明中插入所有函数定义/实现。这对我来说是粗俗和丑陋的,但如果这是唯一可行的方法,我将不得不忍受它。但是(对我个人而言)有一个如此巨大的块包含“一切”是非常恶心的,所以如果可能的话,我宁愿避免这种情况。

注意:这不是征求关于程序风格的意见——恰恰相反。我只想知道与我在上面的示例中展示的传统 C 语法/布局最接近的 javascript 语法实际上是什么。如果最接近我的示例的 javascript 语法/布局在某种程度上慢、效率低或功能有问题,我愿意接受有关执行效率的评论。谢谢。

4

1 回答 1

3

最接近您想要实现的语法是将函数成员初始化为null您的命名空间对象:

var mynamespace = {
    varname00: value,
    varname01: value,
    varname02: value,
    funcname00: null,
    funcname01: null,
    funcname02: null
};

然后将函数表达式分配给这些成员,例如:

mynamespace.funcname02 = function(num, str) {
    econsole.logStringMessage("funcname02() : " + str + num);
    return num;
};

请记住,这些函数不会被提升,这意味着它们不能被位于命名空间声明及其实现之间的代码调用。

直接在命名空间中定义函数是 Javascript 中的常见风格:

var mynamespace = {
    varname00: value,
    varname01: value,
    varname02: value,
    funcname02: function(num, str) {
        econsole.logStringMessage("funcname02() : " + str + num);
        return num;
    }
};
于 2013-02-20T09:12:32.157 回答