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');
答案 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"
call
和apply
您可以使用call
或apply
间接调用函数。你仍然需要括号(除非你使用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.myFunction
,this
引用内部元素集。如果它是与元素集无关的静态方法,则将其单独放在外面,或者可能放在$.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,调用等。