【问题标题】:How to implement optional parentheses during function call? (function overloading)如何在函数调用期间实现可选括号? (函数重载)
【发布时间】:2010-09-21 14:01:12
【问题描述】:

我猜这是不可能的,但我希望 ff() 做同样的事情。

   var f = function(str){ console.log(str||'foo'); }();

   f;                      // wanted output: 'foo'
   f();                    // wanted output: 'foo'
   f('bar');               // wanted output: 'bar'

因为f 不再是函数定义,所以似乎不可能做到f(),但也许我遗漏了一些东西。有什么建议吗?

【问题讨论】:

    标签: javascript overloading


    【解决方案1】:

    不,那是不可能的。需要括号来确定应该调用该函数。

    表达式f() 的值是调用函数的结果,而f 的值是函数本身(如果显示它,f.tostring() 也是)。

    【讨论】:

    • 没错,我想重载它:)
    • @vol7ron:那行不通。如果ff() 相同,那么f('bar') 将与f()('bar') 相同,与f()()('bar') 相同,与f()()()('bar') 相同...等等,使得在函数调用中不可能使用参数。
    • 是的,似乎每个人都想描述正在发生的事情 - 我了解正在发生的事情,这就是我提出问题的原因。正如Adam 指出的那样,我真的很好奇该语言是否已经发展以及现在是否有可能,比如Ruby。
    • @vol7ron:我解释了答案中发生的事情,在最后一条评论中,我试图解释为什么无法按照您建议的方式使用该语言。为了让ff() 具有相同的含义,您必须引入一个新的关键字,如@9​​87654333@ 来表达f 的当前含义。这将导致像$('a').click(function(){...}); 这样的代码必须重写为$('a').click(delegateof function(){...});,因此从函数调用中删除括号将需要在其他地方添加更多代码,并破坏大多数现有网页。
    • 我想您的 $() 是用于 Prototype 或 JQuery 的 document.getElementById 的实现,我都不在乎使用这两个 :) - 我不太介意其他人的代码破解,脚本应该被维护,而不是被遗忘。否则会有一大堆更多的安全漏洞可用。此外,如果您使用的是 JS 包,那么实际上它应该只由一个源维护,然后它会打包并有效地修复所有那些“损坏”的页面。不过,您的观点是有效的,+1
    【解决方案2】:

    不可能。括号是 javascript 如何知道您希望执行方法对象的方式。

    【讨论】:

    • 是的,我只想在使用动作词时使 JavaScript 更简洁。例如:Object.exec - exec 是一个现在时动词,所以我希望它是一个函数,因此 () 只是添加了无意义的,但可选参数可能是必要的 Object.exec('in-background')。我不使用动词作为变量,除非它们是过去时态,它会存储布尔值。
    • @vol7ron:我理解你想要做什么,但除非语言特别支持这种语法——就像 Ruby 那样——你就不走运了。而在 JavaScript 的情况下,你就不走运了。
    • 是的,以前可能有人问过,我要么只使用函数字面量,另一个变量,要么使用全局变量而不是参数。
    【解决方案3】:

    从你的定义中删除()

    var f = function(str){ console.log(str||'foo'); };
    

    除了你的第一个案例,所有这些都可以工作。你需要指定()来告诉javascript执行函数

    【讨论】:

    • 问题的重点是同时拥有ff(),放弃() 会破坏目的:(
    • @vol7ron 当你的函数定义中有() 意味着你实际上正在执行它并分配结果,在这种情况下是f
    • Because f is no longer a function definition, it doesn't seem possible to do f() - 我想我已经指出了这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多