【问题标题】:in javascript, same code parsing arguments in different functions - copy or not?在 javascript 中,不同函数中的相同代码解析参数 - 是否复制?
【发布时间】:2011-10-21 09:18:33
【问题描述】:

有一系列函数,每个函数都以相同的方式解析其参数。现在这个解析块被剪切并粘贴到每个函数的开头。有没有更好的方法来做到这一点?

Post.update = 函数(e){ // 解析参数 var e、el、orig_el、args、渲染、回调; for( var i=0; i

参数被解析而不是单独传递的原因是,有五个以上可能的参数

  • 我在使用长长的 args 列表调用 func 时很容易出错

  • 将一个参数更改为函数意味着更改对 func 的每次调用

  • 恕我直言,与准确传递必要的参数相比,具有五个参数的函数非常不可读

所以我的目标是抽象函数的解析部分,同时保持函数调用的清晰度。

【问题讨论】:

    标签: javascript function syntax readability


    【解决方案1】:

    当然你应该使用一个函数来防止复制和粘贴所有代码!

    如果您想更改代码中的单个字符怎么办?现在您必须再次复制并粘贴所有内容!这真的不好。

    将该代码粘贴到一个函数中并每次调用它,这样当您在代码函数中更改某些内容时,更改将反映到使用该函数的每个地方。

    您是否担心将这么多参数传递给函数?你真的必须担心,因为将这么多参数传递给一个函数真的很糟糕。只需将所有参数粘贴到一个对象中,然后只将该对象传递给函数,如下所示:

    var arg = {
        arg1: 'bla bla bla',
        arg2: 4,
        //.....
    };
    
    // call the function passing only one parameter
    myFunction( arg );
    

    然后在函数内部你将有一个参数,你可以像这样访问所有其他参数:

    function myFunction( arg ) {
        // arg.arg1
        // arg.arg2 ...
    }
    

    【讨论】:

    • 1) 如果参数被卡在一个对象中,那么由于属性名称,就不需要函数来解析参数 - 这就是你最后所说的。 2)对我来说并不过分令人愉悦,但比五个参数好得多。 3)这些函数也用作事件触发器,因此也需要成为它的包装器。
    • 您可以在函数调用中传递动态创建的对象,而无需创建它并将其存储到变量中,它只是一个文字对象。
    • 如果你不需要解析它们,因为你已经在一个对象中拥有它们,那么更好,你根本不需要那个函数:)
    • 明白。它变得很像方案中的命名参数等。同意它的实用性,但不迷恋美学。然后像只有一个属性名称(arg解析你可以有任何数字)和触发器使用的函数这样的小问题让我更喜欢解析 - 尽管我同意你所说的一切。
    • 没关系,但是我建议你开始使用这些对象,因为它们在 JS 编程中非常有用:)
    【解决方案2】:

    而不是从一个函数中解析 5 个参数,你应该意识到函数不应该有超过 3 个参数。

    你想要做的是让最后一个参数是一个对象

    Post.update = function(ev, obj) {
      // obj.el
      // obj.render
      // obj.ev
      // obj.cb
    }
    

    然后只需要有一个可以重复使用的功能

    Post.parseObj = function(obj) {
      ...
    } 
    
    Post.update = function(ev, obj) {
      obj = Post.parseObj(obj);
    }
    

    【讨论】:

    • 据我了解,有点像没有 Ruby 语法帮助的 Ruby。这将要求在传递之前将参数放入对象中,并且在函数中使用将是一级间接的,例如,obj.el 而不是 el
    • @cc_young 如果有任何明显的性能差异,您可以随时将它们设为本地。是的,哈希对象是用户向函数中插入大量参数的最佳方式。想想$.ajax
    • 有没有像 php 的 extract 这样的东西会从对象中提取属性并将它们放入本地范围?
    • @cc_young 没有。你为什么在乎,你这个微优化恶魔
    【解决方案3】:

    定义一次函数并重用它们

    var update = function (e) { /* etc */ }
    Post.update = update;
    

    【讨论】:

    • 不要按照你所说的让两个不同的函数以相同的方式解析参数 - 每个函数定义一次
    【解决方案4】:

    为什么不使用 Post.parseArgs 函数?

    Post.parseArgs = function(args)
    {
        // parse args
        var e, el, orig_el, args, render, callBack;
        for( var i=0; i<arguments.length; i++ ) {
                if( arguments[i] instanceof HTMLElement ) orig_el = arguments[i];
                else if( arguments[i] instanceof Render ) render = arguments[i];
                else if( arguments[i] instanceof Event ) {
                        e = arguments[i];
                        orig_el = orig_el || e.target;
                }
                else if( typeof arguments[i] == 'function' )  callBack = arguments[i];
        }
        // return what you want...
    }
    

    【讨论】:

    • 所以 Post.parseArgs 将在 Post.update 内被调用 - 然后我们下一步将变量从 parseArgs 中取出并放入函数 update
    猜你喜欢
    • 2016-10-26
    • 2023-03-25
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多