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