在没有括号的情况下在JavaScript中调用函数

时间:2010-10-14 03:05:51

标签: javascript

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');

7 个答案:

答案 0 :(得分:38)

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 5th ed中的附加内容。

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

var o = {};

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

o.helloWorld; // will alert "hello world"
Chrome或Safari中的

Try this example或每晚的Firefox。

答案 1 :(得分:4)

new


您可以使用new来调用函数。扭曲是在函数this内成为由函数构造的对象而不是通常的对象。

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

callapply


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

答案 2 :(得分:4)

function message() {return "Hello crazy world!"; }
Function.prototype.toString = function() { return this.call(this); };
alert(message);

答案 3 :(得分:1)

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

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

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

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

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

您应该将方法放在合理的位置,如果是一组元素,请使用$.fn.myFunctionthis引用内部元素集。如果它是与元素集无关的静态方法,则将其单独放在外面,或者可能放在$.myFunction

答案 4 :(得分:1)

您可以尝试这样的事情

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

test.method1("foo");
test.method2("fooo");

答案 5 :(得分:0)

您可以创建函数引用,但是您将无法传递参数:

function funky() { alert("Get down with it"); }

obj.onclick = funky;

答案 6 :(得分:0)

使用模板文字:

alert`WOW`

它更干净,更短,无需依赖jQuery,调用等。