Javascript客户端脚本的设计和应用

2019-06-03 21:43:33于海丽


  9、FUNCTION

  function fun_1(arg1, arg2) {
    rs = arg1 + arg2;
    return rs;
  }
  FUNCTION在Javascript中的写法与JAVA中的有很大的差异。
  首先是参数类型的问题,参数前面不需要加任何类型描述,VAR也不能加。Javascript方法参数也有传值和传引用之分,规则与JAVA基本一致,具体请查阅相关资料。
  其次是返回值,返回值的类型不需要标明,RETURN会返回相应的对象,若无RETURN的数据,则返回值为undefined。从这个意义上讲,FUNCTION总是有返回值的。
  最后是参数个数的问题,参数列表并不限制实际传入函数的参数个数,它只是提供了一个访问参数的快捷方式,也就是说给了特定位置参数一个特定的名字。

  sum = fun_1(1) ;
  以上函数调用时只传给 fun_1 一个参数( fun_1 定义时需要两个参数)。那么此时 arg2 的值是什么呢?undefined,你猜对了。
  我们可以把 fun_1 改成以下形式来应对这种情况。
  function fun_2(arg1, arg2) {
    if ( !arg1 ) arg1 = 0;
    if ( !arg2 ) arg2 = 0;
    rs = arg1 + arg2;
    return rs;
  }
  undefined在布尔表达式中相当于 false 。

  好了,问题似乎解决了。可是如果我们要处理更多参数怎么办呢?例如以下函数调用所代表的情况。
  sum = fun_2(1, 2, 3) ;
  在函数内部有一个Arguments对象,它是一个参数数组,通过它可以访问到传入函数的所有参数。
  根据这一特性我们把 fun_2 改成 fun_3。
  function fun_3 () {
    rs = 0;
    for (var i = 0 ; i < Arguments.length; i++) {
      rs += parseInt( Arguments[i] );
    }
    return rs;
  }
  注意:这里使用了parseInt而不是直接加法引起的隐式转化。这是因为隐式转化的要求过高,而且有可能把 rs 转化为其他内部类型。
  0 + "23a" = NaN;0 + parseInt ( "23a" )= 23

  function Point ( x, y ) {
    this.x = x;
    this.y = y;
    this.func = m_func;
  }
  function m_func( num ) { ... }
  var newPoint = new Point( 1, 3 );
  newPoint.func( newPoint.x + new Point.y);
  任何一个函数都可以成为构造函数,在函数中的 this 关键字同JAVA中意义类似,但不完全相同。
  通过 new 产生的对象最终会通过垃圾回收机制清除。
  函数也是Javascript的内部类型之一,所以可以赋给某个变量,注意不要加 () ,()实际上也是一个操作符表示对函数的调用。
  this.func = m_func; 表示把m_func函数赋给 this 的 func 成员变量。
  this.func = m_func(); 表示把m_func函数调用的返回值赋给 this 的 func 成员变量。