【问题标题】:Make the parentheses in function calls optional使函数调用中的括号可选
【发布时间】:2011-01-22 10:35:49
【问题描述】:

嘿,我即将为我的 JavaScript 库重写核心文件,我正在寻找更好的方法来做所有事情。其中之一是我如何使括号可选,例如一些函数调用看起来像这样。

Spark('p').content('Hello, World');

还有其他类似的。

Spark.browser();

所以我有 Spark 函数的可选括号。我说这将是最好的方法是对的吗?

window.Spark = function(arg1, arg2) {
    return {
        fn: function() {
            alert('run');
        }
    };
};

for(var f in Spark())
    Spark[f] = Spark()[f];

Spark.fn();
Spark(true, false).fn();

这对我来说似乎是错误的,尽管这是我想出的唯一可行的方法。

【问题讨论】:

  • 你想要完成什么?
  • 哦,抱歉,正如我的示例所示,我需要使用带或不带括号的Spark 函数,我已经通过上述方法完成了此操作,但有没有更好、更清洁的方法。跨度>
  • 是的,但退一步说,实际要求是什么?如果你调用它并不重要,为什么Spark 是一个函数?如果你可以忽略它有论据的事实?您的解决方案不会使括号成为可选,它只是将调用Spark 产生的对象的属性混合到Spark 函数对象中,而没有参数。我很难找到一个合理的用例,而不是默认的Spark 对象(可能是DefSpark 甚至Spark.default)。
  • 嗯,我不太确定。为什么要使括号可选?如果是这样,您可以在不附加大括号的情况下运行 Spark.browser 函数,那么我认为您不走运。
  • 不,我想让Spark 需要括号,而不是它的功能。

标签: javascript function object


【解决方案1】:

您在正确的道路上,但要小心。就目前而言,每次调用Spark(...) 时都会实例化fn 函数,这将导致较小的性能和内存使用问题。

更简洁的方法是使用一个类并将所有这些函数存储在原型中以避免不必要的内存使用:

window.Spark = (function(){

  function inner(arg1, arg2) {
    this.arg1 = arg1;
    this.arg2 = arg2;
  }

  inner.prototype = {
    fn : function() { alert('run') }
  };

  function S(arg1, arg2) { return new inner(arg1, arg2) }

  var dflt = S();
  for (var f in dflt) S[f] = dflt[f];

  return S;
})();

【讨论】:

  • "... 这会导致轻微的性能和内存使用问题..." 不一定是轻微的。这取决于这些东西的数量。
  • 我还在试验这段代码,看看我是否可以访问我想要的所有内容,看起来它已经完成了这项工作,如果有的话我会接受。
  • @T.J.克劳德:你是对的,当然。性能下降总是取决于次优代码的运行频率以及运行它的数据大小。 ;-)
  • 为了澄清一下,我只是做了一些基本的测试,初始化时间 。所以我看不出你认为这些性能问题来自哪里。此测试使用的方法可能会导致“轻微的性能和内存使用问题”jsfiddle.net/Wolfy87/qDXC5
【解决方案2】:

是的,这是可能的,但你为什么要这样做?为了让 JavaScript 看起来像其他一些不需要括号(方括号是那些方形的东西)的语言(如 VB 和 Delphi)的函数? JavaScript 的创建者已经决定,无论参数的数量如何,都应该使用括号调用函数。您实际上是在创建引用函数结果的属性只是为了跳过两个字符。

我认为你真正在寻找的是一个类或对象。你可以这样写:

function MyClass(Parameter /*optional*/)
{
  // Initialization (optional)
  this.anyProperty = parameter;

  this.anyMethod = function(p)
  {
    alert(p);
  }
}

// Or declare methods like this (faster and more efficient)
MyClass.prototype.anyMethod2 = function(p)
{
  alert(p);
}

现在,您可以实例化这个类并调用方法:

var c = new MyClass;
c.anyMethod2('Hello world!');

这只是一个小例子,但您应该真正阅读有关声明和使用类的内容,因为我认为这可能是您正在寻找的内容。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多