Javascript 调用函数的最小方法

Javascript 调用函数的最小方法,javascript,short,Javascript,Short,首先,我像这样调用我的函数: var a=1; a=foo(a,2); var a=1; a=a.foo(2); 然后我发现了prototype,并像这样调用了我的函数: var a=1; a=foo(a,2); var a=1; a=a.foo(2); 如果用于阵列或对象,则更小: var a=[1,2,3]; a.foo(2); 有没有一种方法可以调用这样的函数:a(2)或a[2]用黑客之类的东西?你可以这样做 var a=[1,2,3]; var m = "reallyLongM

首先,我像这样调用我的函数:

var a=1;
a=foo(a,2);
var a=1;
a=a.foo(2);
然后我发现了
prototype
,并像这样调用了我的函数:

var a=1;
a=foo(a,2);
var a=1;
a=a.foo(2);
如果用于阵列或对象,则更小:

var a=[1,2,3];
a.foo(2);
有没有一种方法可以调用这样的函数:
a(2)
a[2]
用黑客之类的东西?

你可以这样做

var a=[1,2,3];
var m = "reallyLongMethodName";
a[m](2);
它将使用调用
a.reallyLongMethodName(2)

这样的事情在JavaScript中是可能的:

var a=[1,2,3];
var c = a.foo;
c(2);
但是,这在您的情况下不起作用,因为
c
中的
引用将不再是数组

您可以使用
call()

但这对你来说可能太长了

您还可以创建一个包装器函数

function c(ar, val) {
    ar.foo(val);
}

c(a, 2);
。。。但是,这对你来说可能太长了;)

总之,你所得到的是尽可能短的祝贺你。您已使代码尽可能不可读。

您可以这样做

var a=[1,2,3];
var m = "reallyLongMethodName";
a[m](2);
Array.prototype.foo = function(index) {
    return this[index];
};

var a=[1,2,3];

a = a.foo.call.bind(a.foo, a);


a(2); //3; 
a(1); //2
a(0); //1
它将使用调用
a.reallyLongMethodName(2)

这样的事情在JavaScript中是可能的:

var a=[1,2,3];
var c = a.foo;
c(2);
但是,这在您的情况下不起作用,因为
c
中的
引用将不再是数组

您可以使用
call()

但这对你来说可能太长了

您还可以创建一个包装器函数

function c(ar, val) {
    ar.foo(val);
}

c(a, 2);
。。。但是,这对你来说可能太长了;)



总之,你所得到的是尽可能短的祝贺你。您已使代码尽可能不可读。

一个问题。。。为什么?为什么?为什么?只是为了好玩还是为了学习…:)使代码尽可能小/短会抑制可读性/可维护性。如果您担心生产环境中的有效负载,请考虑使用小型化器,例如您认为这里到底发生了什么?每次调用函数的方式都完全相同。唯一需要更改的是具有函数值的属性的对象(以及在第一种情况下需要显式传入一个参数的事实,该参数在后一种情况下作为
this
传入,但这不是问题的重点)。。。为什么?为什么?为什么?只是为了好玩还是为了学习…:)使代码尽可能小/短会抑制可读性/可维护性。如果您担心生产环境中的有效负载,请考虑使用小型化器,例如您认为这里到底发生了什么?每次调用函数的方式都完全相同。唯一需要更改的是具有函数值的属性的对象(而且在第一种情况下,您需要显式传入一个参数,该参数在后一种情况下作为
this
传入,但这不是问题的重点)。在某些浏览器中,将函数分配给变量是不起作用的(我想到了IE9)@user1365010:我不明白你想说什么?@jbabey:那不可能是真的?这是JavaScript的基本原理..你有例子吗?:O.@Matt我没有实际测试过它,我只是在上面读过。当你将
a.foo
分配给
c
时,你基本上失去了上下文对象
a
。调用
c(2)
然后在全局对象上查找属性
c
,而不是
a
,但失败了。Oi人员看到@Esailija的responce.。更好的解决方案!为变量分配函数在某些浏览器中不起作用(想到IE9)@user1365010:我不明白你想说什么?@jbabey:那不可能是真的?这是JavaScript的基本原理..你有例子吗?:O.@Matt我没有实际测试过它,我只是在上面读过。当你将
a.foo
分配给
c
时,你基本上失去了上下文对象
a
。调用
c(2)
然后在全局对象上查找属性
c
,而不是
a
,这会失败。Oi人员会看到@Esailija的responce..更好的解决方案!
Array.prototype.foo = function(index) {
    return this[index];
};

var a=[1,2,3];

a = a.foo.call.bind(a.foo, a);


a(2); //3; 
a(1); //2
a(0); //1