javaScript的函数

1.函数

    注意:定义函数时可以使用个数可变的参数,而且函数既可以有return语句,也可以没有return语句;如果函数不包含return语句,它就只执行函数体中的每条语句,然后返回给调用者undefined。

    使用运算符typeof来检测参数的数据类型,使用if(!param)return;来判断是否存在该参数,因为js是一种无类型语言,所以你不能给函数的参数制定一个数据类型,而且js也不会检测传递的数据是不是那个函数所需要的类型,如果参数很重要时,就使用前面介绍的运算符进行检测。

    不可变参数js的处理:如果传递的参数比函数需要的个数多,那么多余的几个参数被忽略掉,如果传递的参数比函数需要的个数少,那么多余的几个参数就会被赋予undefined,在大多数情况下,这回使得函数产生错误。

2.嵌套函数

    a,函数定义中可以嵌套其他函数的定义,但是只能在在顶层全局代码和顶层函数代码中,不能出现在循环或条件语句中,并且这些限制只应用于由function语句声明的函数,函数直接量可以出现在任何js表达式中。

3.Function()构造函数

    可以使用Function()构造函数和new运算符动态地定义函数, var f = new Function("x","y","return x*y;");它等价于:function f(x,y){return x*y;}

    Function构造函数可以接受任意多个字符串参数,它的最后一个参数是函数的主体,其中可以包含任何js语句,语句之间用分号分隔。由于传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名,用Function()构造函数创建的未命名函数有时被称作为“匿名函数”。

    Function()函数存在的意义:因为Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中;另一个原因是它能将函数定义为js表达式的一部分,而不是将其定义为一个语句;缺点是:这样做每次调用一个函数时,Function()构造函数都要对它进行编译,

4.函数直接量

    函数直接量是一个表达式,它可以定义匿名函数。

    function f(x){return x*x;}                  //function语句

    var f = new Function("x","return x*x;");    //Function()构造函数

    var f = function(X){return x*x;};           //函数直接量

    虽然函数直接量创建的是未命名函数,但是它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时特别的有用,e.g

var f= function fact(x){if(x<=1)return 1; else return x*fact(x-1);}

总结:function()函数可以任意的使用,具有通用性,Function()函数和函数直接量具有很多的相似性,他们都是未命名函数(函数直接量可以有函数名,尤其是在子调用函数中),函数直接量有个重要的有点,函数直接量只被解析和编译一次,而作为字符串传递给Function()构造函数的js代码则在每次调用构造函数时只需要被解析和编译一次。

函数最重要的特性就是他们能够被定义和调用,但是在js中函数并不只是一种语法,还可以是数据,可以把函数赋给变量、存储在对象的属性中或存储在数组的元素中,传递给函数。其实函数名并没有什么实际意义,它只是保存函数的变量的名字,可以将这个函数赋给其他的变量,它仍然以相同的方式起作用,

e.g    function square(x){x*x;}

var a = square(4);

var b = square;//这种情况下b引用的函数和square的作用相同

var c = b(5);

除了赋给全局变量之外,还可以将函数赋给对象的属性,这是称函数为方法;也可以赋给数组元素。

e.g

    var a =  new Object;     var a = new Object();

    a.square = new Function("x","return x*x";);

    y = o.square(16);

e.g   

    var a = new Array(3);

    a[0] = function(x){return x*x;};

    a[1] = 20;

    a[2] = a[0](a[1]);

    除这些之外,如何将函数作为参数传递给其他函数,

e.g

function  add(x,y){return x+y;}

function subtract(x,y){return x-y;}

function multiply(x,y){return x*y;}

function dibide(x,y){return x/y;}

function operate(operator,operand1,operand2){

    return operator(operand1,operand2);

}

var i = operate(add,operate(add,2,3),operate(multiply,4,5));

var operators = new Object();

operators["add"] = function(x,y){return x+y;}

operators["multiply"] = function(x,y){return x*y;}

operators["divide"] = function(x,y){return x/y;}

operators["pow"] = Math.pow;

function operate2(op_name,operand1,operand2){

    if(operators[op_name] == null)return "unknow operator";

    else    return operators[op_name](operand1,operand2);

}

var j = operate2('add',"hello",operate2("add","","world"));

var k = operate2('pow',10,2);

5.函数的作用域,调用对象

    函数的作用域中除了全局变量、函数内部的局部变量和形式参数外,函数还定义了一个特殊属性,

    arguments,这个属性应用了另外一个特殊的对象-----Arguments对象,因为arguments属性是调用对象的一个属性,所以它的状态和局部变量以及函数的形式参数是相同的。

    所以arguments标识符被看做是保留字,不能将它作为变量名或形式参数名。

6.Arguments对象

    arguments它具有特殊的意义,是调用对象的一个特殊属性,用来引用Arguments对象,Arguments对象就像数组,可以按照数字获取传递给函数的参数值,但是它并非真正的Array对象。

    arguments具有length属性,

    可以使用arguments来检测调用函数使用了正确数目的实际参数,

注意:arguments并非真正的数组,它是一个Arguments对象,Arguments对象有一个非同寻常的特征,当函数具有命名了的参数时,Arguments对象的数组元素是存放函数参数的局部变量的同义词。

e.g 

  function(x){

    alert(x);  //显示参数的初始值

    arguments[0] = null;//改变数组预算也会改变x

    alert(x);  //现在显示为“null”

除了数组元素,Arguments对象还定义了callee属性,用来引用当前正在执行的函数,这对未命名的函数调用自身非常有用。

e.g

 function(x){

    if(x<-1)return 1;

    return x*arguments.callee(x-1);

}

7.函数的属性和方法

    由于函数是对象,所以它具有数据和方法。

函数的length属性

    函数的属性length和arguments属性的length不同,arguments数组的length属性指定了传递给该函数的实际参数数目,并且arguments属性的length只在函数内部起作用,而函数自身的length属性它是只读的,返回的是函数需要的实际参数的数目,并且函数的属性length函数体的内部和外部都在是有效的

函数的prototype属性

    每个函数都有一个prototype属性,它引用的是预定义的原型对象,原型对象在使用new运算符把函数作为构造函数时起作用。

函数自定义属性

    有时候定义全局变量比较乱,可以通过自定义函数属性来解决

函数的apply()和call()方法

    他们的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值,call()的剩余参数是传递给要调用的函数的值,apply()的剩余参数是由数组指定的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值