功能参数列表太长|最小化

时间:2012-08-10 22:45:25

标签: javascript

随着这个动画变得越来越复杂,我不断添加参数,以便在每次回调时都可以使用它们。目前共有6个。

例如,现在我想在显示消息时禁用输入框,所以我必须添加另一个元素 - in_element;

致电:

    Mo.C.movePane( cover_element, pane_element, 0, 0, 0, 'begin' );

功能:

    movePane: function( cover_element, pane_element, start, end, index, state ) {
        if( ( state === 'begin' ) ) {
            start = parseInt( window.getComputedStyle( pane_element, null ).getPropertyValue("top"), 10 );
            end = start + 40;
            index = start;
            state = 'down';
            cover_element.style.display = 'inline';
            Mo.C.movePane(cover_element, pane_element, start, end, index, 'down' );
        }
        if( ( state === 'down' ) && ( index < end ) ) {
            index += 1;
            pane_element.style.top = ( index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 1 );
        }
        else if( ( state === 'down' ) && index === end ) { 
            state = 'up';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 2000 );
        }
        else if( ( state === 'up' ) && ( index > start ) ) {
            index -= 1;
            pane_element.style.top = ( index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane(cover_element, pane_element, start, end, index, state ); }, 1 );
        }
        else if( ( state === 'up' ) && ( index === start ) ) {
            cover_element.style.display = 'none';
            // signup_pass_input.addEventListener( "keypress", Mo.UserNew.enter, false );
        }
    }
};

可能的解决方案

  • 将所有内容包装在名为object_all = {}的单个对象中,并仅传递这一个变量。
  • 以某种方式分解功能 - 可能拉出开始和结束条件以分离功能
  • 从函数参数移动到对象属性(静态)以保持所需的变量持久

4 个答案:

答案 0 :(得分:2)

当有多个参数时,使用对象是正常的。 下面是一个重构代码的示例:

function( cover_element, pane_element, opt ) {
  var delay=1;
  if (!opt) {
    opt = {};
    opt.start =
      parseInt(
        window.getComputedStyle( pane_element, null ).
          getPropertyValue("top"),
        10
      );
    opt.end = opt.start + 40;
    opt.index = opt.start;
    opt.state = 'down';
    cover_element.style.display = 'inline';
  }

  switch(opt.state) {
    case 'down':
      opt.index += 1;
      if (opt.index >= opt.end) {
        opt.index = opt.end;
        opt.state = 'up';
        delay=2000;
      }
      break;
    case 'up':
      opt.index -= 1;
      if (opt.index <= opt.start) {
        cover_element.style.display = 'none';
        opt = null;
      }
  }

  if (opt) {
    pane_element.style.top = ( opt.index ) + 'px';
    setTimeout(
      function( ){
        Mo.C.movePane(cover_element, pane_element, opt);
      },
      delay
    );
  }
}

并称之为:

Mo.C.movePane(elem1, elem2);

切换方向时的延迟现在是2000而不是2001。

答案 1 :(得分:1)

@mVChr有正确的答案:传递一个具有各种参数属性的对象。这是一个标准范例,使许多接口非常干净。请参阅jQuery的$.ajax()方法作为一个很好的例子。

答案 2 :(得分:1)

建议使用对象。你也可以按照下面给出的那样做

function movePane() {
    var a = arguments; // to make it easy
    var name = a[0];
    var age = a[1];
    var place = a[2];
    console.log(name, age, place)
}

movePane("abc", 28, "def");

答案 3 :(得分:0)

根据评论答案:

使用对象o。请注意,您不必初始化对象属性即可使用它们。非常简洁。

        var o = {};
            o.cover_element = cover_element;
            o.pane_element = pane_element
            o.state = 'begin';
        Mo.C.movePane( o );
        return o_p;
    },
    movePane: function( o ) {
        if( ( o.state === 'begin' ) ) { 

            // start

            o.start = parseInt( window.getComputedStyle( o.pane_element, null ).getPropertyValue("top"), 10 );
            o.end = o.start + 40;
            o.index = o.start;
            o.state = 'down';
            o.cover_element.style.display = 'inline';
            Mo.C.movePane( o );
        }
        else if( ( o.state === 'down' ) && ( o.index < o.end ) ) { 

            // move down

            o.index += 1;
            o.pane_element.style.top = ( o.index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 1 );
        }
        else if( ( o.state === 'down' ) && ( o.index === o.end ) ) { 

            // pause

            o.state = 'up';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 2000 );
        }
        else if( ( o.state === 'up' ) && ( o.index > o.start ) ) { 

            // move up

            o.index -= 1;
            o.pane_element.style.top = ( o.index ) + 'px';
            setTimeout( function( ){ Mo.C.movePane( o ); }, 1 );
        }
        else if( ( o.state === 'up' ) && ( o.index === o.start ) ) { 

            // complete

            o.cover_element.style.display = 'none';
        }
    }
};