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

err*_*ler 2 javascript

JavaScript中有没有办法调用没有括号的函数?

例如在jQuery中:

$('#wrap').text("asdf"); 会工作,所以会 $.ajax(ajaxOptions);

我正在将函数(类)映射到window.$具有一组我希望能够使用或不使用括号调用的函数.像jQuery一样.

这是一个代码示例:

function Test(asdf) {
  this.test = function(testVar) { return testVar + ' asdf'; }
}
Run Code Online (Sandbox Code Playgroud)

我映射Test()$:

window.$ = new Test();
Run Code Online (Sandbox Code Playgroud)

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

$('asfd').test('ASDF');
Run Code Online (Sandbox Code Playgroud)

但是我希望能够像这样调用它:

$.test('asdf');
Run Code Online (Sandbox Code Playgroud)

Anu*_*rag 38

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

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

function myFunction() {
    // do some awesome web 2.0 stuff
}
Run Code Online (Sandbox Code Playgroud)

既然myfunction是一个函数,也是一个对象,所以你也可以将键值对附加到它,这就是jQuery的作用.要验证myFunction也是一个对象,请instanceof检查:

myFunction instanceof Function; // true
myFunction instanceof Object; // true
Run Code Online (Sandbox Code Playgroud)

因此,我们可以向函数添加属性,这些函数可以是简单值,也可以是函数本身.

// 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
};
Run Code Online (Sandbox Code Playgroud)

但如果这不是你的问题,并且你真的想知道你是否可以在不使用括号的情况下直接调用函数,那么答案是肯定的,你可以使用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"
Run Code Online (Sandbox Code Playgroud)

每晚在Chrome或Safari或Firefox中试用此示例.


Dag*_*bit 5

new


您可以使用调用函数new。曲解是,在函数内部this变成了由函数构造的对象,而不是通常的构造对象。

function test () { alert('it worked'); }
...
new test; // alerts "it worked"
Run Code Online (Sandbox Code Playgroud)

callapply


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


Mik*_*rov 5

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

  • 我在这个答案中算了8个括号。 (7认同)