在单个语句中声明具有额外属性的javascript函数?

时间:2013-04-02 00:37:16

标签: javascript closures

我知道我可以在函数上定义属性,然后可以在函数中访问它们。现在,我能解决的唯一语法涉及两个语句。是否有更简洁的方式来表达以下内容:

function myFunc() {
    // do some work
}
myFunc.myProp = 0;

我不是在寻找一个更少字符的解决方案 - 这不是代码高尔夫。我问的更多的是“是否有不同的功能声明模式具有其他理想的优点?”这几乎是关于使用闭包的方法(因为我怀疑答案就在那里)。

谢谢!

3 个答案:

答案 0 :(得分:2)

特别是如果你想从函数本身内部访问函数的属性,你最好这样做:

var theFunction = function() {
  function theRealFunction() {
    // the code
    if (theRealFunction.something == "not whatever")
      // do something
    // more code
  }

  theRealFunction.something = "whatever";
  return theRealFunction;
}();

这样做是将函数声明包装在匿名函数中。通过函数名访问函数属性的问题在于它必须通过在周围范围内查找函数的名称来实现。这有点蠢,但至少这种方式涉及的范围本质上是私人的。无论结果函数(作为匿名函数的返回值返回)是否被赋值给另一个变量,作为处理函数传递给函数等,它都可以工作。

答案 1 :(得分:2)

这真的,真的都取决于。如果您正在寻找私有变量,那么您可以轻松地从函数返回一个函数 - 内部函数将包含对其父级范围的访问。

var outer_function = (function () {
    var private_var = "secret",
        public_var  = "public",

        inner_function = function () {
            return private_var;
        };

    inner_function.public_var = public_var;
    return inner_function;
}());

outer_function现在等于inner_function,可以访问随附的数据。现在,任何附加到内部的属性(以您的方式)都可以作为outer的公共属性进行访问。

为此,您可以返回一个具有公共静态属性的类的构造函数,其中所包含的vars充当私有静态属性,在您构建的“类”的每个实例之间共享。

答案 2 :(得分:1)

不完全是你问题的答案,但是如果你想要阅读一些可以在定义javascript函数时使用的不同设计模式,这是我在这个主题上读过的最好的文章之一: / p>

http://www.klauskomenda.com/code/javascript-programming-patterns/