【问题标题】:Smallest way to call a function调用函数的最小方法
【发布时间】:2012-06-19 13:20:07
【问题描述】:

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

var a=1;
a=foo(a,2);

然后我发现prototype 并像这样调用我的函数:

var a=1;
a=a.foo(2);

如果是用于数组或对象,则更小:

var a=[1,2,3];
a.foo(2);

有没有办法调用这样的函数:a(2)a[2] 用 hack 之类的?

【问题讨论】:

  • 一个问题...为什么...为什么...为什么?
  • 只是为了好玩或只是为了学习...... :)
  • 使代码尽可能小/短会抑制​​可读性/可维护性。如果您担心生产环境中的有效负载,请考虑使用压缩器,例如 minifyjavascript.com
  • 您认为这里到底发生了什么?您每次都以完全相同的方式调用函数。唯一改变的是具有函数值属性的对象(而且在第一种情况下,您需要显式传入一个参数,在后者中以this 的形式传入,但这不是您的问题的重点)。

标签: javascript short


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    你可以这样做;

    var a=[1,2,3];
    var m = "reallyLongMethodName";
    a[m](2);
    

    这将使用square bracket notation 调用a.reallyLongMethodName(2)

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

    var a=[1,2,3];
    var c = a.foo;
    c(2);
    

    但是,这不适用于您的情况,因为 c 中的 this 引用将不再是数组。

    您可以使用call()apply() 解决此问题;

    c.call(a, 2);
    

    但这可能对你来说太长了。

    你也可以创建一个包装函数;

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

    ...不过,这对你来说可能太长了;)。

    总而言之,你所得到的就是尽可能短...... 恭喜。您已使您的代码尽可能不可读。

    【讨论】:

    • 将函数分配给变量在某些浏览器中不起作用(想到 IE9)
    • @user1365010:我不明白你想说什么?
    • @jbabey:这不可能吧?这对 JavaScript 来说是非常基础的……你有例子吗!? :O.
    • @Matt 我还没有实际测试过它,我只是在MSDN IE9 changelog 上读到了它。当您将a.foo 分配给c 时,您实际上丢失了上下文对象a。调用c(2) 然后在全局对象上查找属性c 而不是a,这会失败。
    • Oi 人们看到@Esailija 的回复.. 更好的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2016-03-31
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2014-09-12
    • 2023-01-13
    相关资源
    最近更新 更多