【问题标题】:Calling a function in JavaScript without parentheses在 JavaScript 中调用不带括号的函数
【发布时间】:2010-10-14 03:05:50
【问题描述】:

在 JavaScript 中有没有一种方法可以调用不带括号的函数?

例如在 jQuery 中:

$('#wrap').text("asdf"); 会起作用,$.ajax(ajaxOptions); 也会起作用

我正在将一个函数(类)映射到window.$,该函数具有一组我希望能够在带或不带括号的情况下调用的函数。喜欢 jQuery。

这是一个代码示例:

function Test(asdf) {
  this.test = function(testVar) { return testVar + ' asdf'; }
}

我将Test() 映射到$

window.$ = new Test();

我必须像这样调用函数(类):

$('asfd').test('ASDF');

但我希望能够这样称呼它:

$.test('asdf');

【问题讨论】:

  • 您能否举例说明这些“不带括号”的外观,或者您希望如何称呼它们?
  • 你的例子,因为没有更好的词:“糟透了”。在这两种情况下,您都在调用带括号的函数
  • 你知道吗,我不想这样做 b/c ur new,但是 -1。这是一个问得不好且演示得不好的问题。
  • 这个问题的定义仍然很差,以至于难以理解。 Test 是一个构造函数,所以 new Test() 创建一个对象。在示例中,新对象不是函数,因此 $ 不是函数。 $.test('asdf') 工作正常;将失败的是$('asfd').test('ASDF')。此外,JS 本身没有类,因此“类”只有在您创建了自己的使用类的继承方案时才有意义。

标签: javascript


【解决方案1】:

JavaScript 非常灵活,因为对象基本上是一个映射并且可以包含任意数量的键值对,其中值本身可以是一个对象,因此您可以嵌套。 JavaScript 另一个有趣的方面是函数本身就是一等对象,因此在键值对中,您可以将函数作为值。

获得类似 jQuery 的东西就变得非常简单。你从一个函数开始(构造函数或类,如果你愿意的话),

function myFunction() {
    // do some awesome web 2.0 stuff
}

由于myfunction 是一个函数也是一个对象,所以你也可以将键值对附加到它上面,这也是jQuery 所做的。要验证 myFunction 也是一个对象,请执行instanceof 检查:

myFunction instanceof Function; // true
myFunction instanceof Object; // true

所以我们可以为函数添加属性,这些属性可以是简单的值,也可以是函数本身。

// adding a simple property that holds a number
myFunction.firstPrime = 2;

// adding a function itself as a property to myFunction
myFunction.isPrime = function(number) {
    // do some magic to determine if number is prime
};

但是,如果这不是您的问题,并且您真的想知道是否可以在不使用括号的情况下直接调用函数,那么答案是肯定的,您可以使用 ECMAScript 第 5 版中的添加内容。

这是一个使用Object.defineProperty 调用函数而不使用括号并将其定义为getter 的示例:

var o = {};

Object.defineProperty(o, "helloWorld", {
    get: function() {
        alert("hello world");
    },
    set: undefined
});

o.helloWorld; // will alert "hello world"

Try this example 在 Chrome 或 Safari 或 Firefox 中夜间使用。

【讨论】:

    【解决方案2】:

    new


    您可以使用new 调用函数。不同之处在于,在函数 this 中,它变成了一个由函数构造的对象,而不是通常的对象。

    function test () { alert('it worked'); }
    ...
    new test; // alerts "it worked"
    

    callapply


    您可以使用callapply 间接调用函数。您仍然需要括号(除非您使用 new),但您不会直接使用括号调用函数。

    【讨论】:

      【解决方案3】:
      function message() {return "Hello crazy world!"; }
      Function.prototype.toString = function() { return this.call(this); };
      alert(message);
      

      【讨论】:

      • 我在这个答案中计算了 8 个括号。
      • 虽然这可能无法解决详细描述的问题,但它确实回答了“如何在没有括号的情况下调用函数”的问题本身
      【解决方案4】:

      你可以试试这样的

      var test = {
          method1 : function(bar) {
              // do stuff here
              alert(bar);
          },
          method2 : function(bar) {
              // do stuff here
              alert(bar);
          }
      };
      
      test.method1("foo");
      test.method2("fooo");
      

      【讨论】:

      • 这怎么不使用括号?
      • 这个答案对这个问题没有意义。 test 甚至不是一个函数,它是一个纯对象。在这两种情况下,我的眼睛都看到了括号。
      • 实际上,这很有意义。 errorhandler 询问如何模仿 jQuery $ 对象。问题的标题不一定正确,但在阅读了整个问题并查看了他们提供的示例后,我觉得我理解了他们在寻找什么。另外,我的回答被接受了,所以我不应该为它辩护。
      【解决方案5】:

      这些示例的不同之处在于 .text() 是 jQuery 对象(它们的实例,元素的包装器)上的函数,它位于 $.fn(jQuery 的原型快捷方式)上,因此它专门用于 jQuery 对象。

      $.ajaxSetup()jQuery 对象/变量本身的方法。

      If you look at the API 很容易判断哪些方法在哪里,jQuery.something() 方法是 jQuery 变量/对象上的方法,与元素集无关,其他所有只是 .something() 的方法是运行的方法针对元素集(在 jQuery 对象实例上)。

      对于你想做的事情,是的可能,但是没有多大意义,例如:

      $.myFuntion = $.fn.myFunction = function() { alert('hi'); };
      

      你应该把你的方法放在有意义的地方,如果它是一组元素,使用$.fn.myFunctionthis 指的是里面的元素集。如果它是与元素集无关的静态方法,请将其单独放置在外部或可能$.myFunction

      【讨论】:

      • @errorhandler - 如果没有 jQuery 作为例子,它真的没有任何意义......因为这是你提供的唯一例子我不知道你所说的“没有”括号是什么意思,如果你是不是指我在答案中的意思。
      • @errorhandler - 它仍然没有任何意义,你应该举一个调用“不带括号”的例子,即使 jQuery 并没有真正做到这一点。 $ 是一个函数 $("#wrap") 是一个返回 jQuery 对象的函数调用,你在 that 对象上调用 .text()。在$.ajax() 的情况下,您在$ 上调用ajax 方法,但在这两种情况下都使用括号。
      • @errorhandler - 现在我更困惑了,因为您的示例确实适用于$.test(),您可以在这里尝试:jsbin.com/arolu3
      • 它不适用于我的大型项目.....我也刚刚意识到我的函数也接受一个变量,例如function Test(asdf) { ...
      【解决方案6】:

      你可以做一个函数引用,但你不能传递参数:

      function funky() { alert("Get down with it"); }
      
      obj.onclick = funky;
      

      【讨论】:

      • 更重要的是,它不会调用函数。这只是分配另一个名称(obj.onclick),如果您稍后调用它,您可以通过它来引用该函数。
      【解决方案7】:

      使用模板文字:

      alert`WOW`
      

      更简洁更短,无需依赖jQuery、调用等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2015-08-25
        • 2023-04-09
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        相关资源
        最近更新 更多