函数
创建函数:
function f(x){…..};
var f = function(x){…};
上面两种形式都可以创建名为f()的函数,不过后一种形式可以创建匿名函数。
函数定义时可以设置参数。如果传给函数的参数个数不够,则从最左边起依次对应,其余的用undefined赋值,如果传给函数的参数多于函数定义参数的个数,则多出的参数被忽略。
JS代码:(见附件test1.html)
function myprint(s1,s2,s3){
alert(s1 + "_" + s2 + "_" + s3);
}
//undefined_undefined_undefined
myprint();
//String1_String2_undefined
myprint("String1","String2");
//String1_String2_String3
myprint("String1","String2","String3","String4");
因此,对于定义好的函数,我们不能指望调用者将所有的参数全部传进来,对于那些必须用到的参数应该在函数体中加以检测(用!操作符),或者设置默认值然后同参数进行或(||)操作来取得参数。
JS代码:(见附件test2.html)
function myprint(s1,person){
//默认person对象
var defaultPerson = {
"name":"name1",
"age":18,
"sex":"female"
};
//s1不允许为空
if (!s1)
{
alert("s1 must be input");
return false;
}
//接受person对象
person = person || defaultPerson;
alert(s1 + "_" + person.name + ":" + person.age + ":" + person.sex);
};
//s1 must be input
myprint();
//s1_name:18:female
myprint("s1");
//s1_wangsy:31:male
myprint("s1",{"name":"wangsy","age":31,"sex":"male"});
函数的armuments属性
在每一个函数体的内部,都有一个arguments标识符。这个标识符代表了一个Arguments对象,Arguments对象非常类似于Array(数组)对象,比如都有length属性,访问它的值用”[]”操作符,利用索引来访问参数值,但是,二者是完全不同的东西,仅仅是表面上有共同点而已(比如说修改Arguments对象的length属性并不会改变它的长度)。
JS代码:(见附件test3.html)
function myargs(){
alert(arguments.length);
alert(arguments[0]);
}
//0 undefined
myargs();
//2 1
myargs("1",[1,2]);
Arguments对象有一个callee属性,标示了当前Arguments对象所在的方法,可以使用它来实现匿名函数的内部递归调用。
JS代码:(见附件test4.html)
function (x){
if (x <= 1) return 1;
return x*Arguments.callee(x-1);
}
method--方法
方法就是函数,我们知道,每一个对象都包含0个或多个属性,属性可以是任意类型,当然也包括对象。函数本身就是一种对象,因此我们完全可以把一个函数放到一个对象里面。此时,这个函数就成了对象的一个方法。此后如果要使用该方法,则可以通过对象名利用”.”操作符来实现。
JS代码:(见附件test5.html)
var obj = {f0:function(){alert("f0");}};
function f1(){
alert("f1");
}
//为对象添加方法
obj.f1 = f1;
//f0 f0是obj的方法
obj.f0();
//f1 f1是obj的方法
obj.f1();
//f1 f1同时又是一个函数,可以直接调用
f1();
//缺少对象 仅仅是obj的方法,只能通过对象调用
f0();
方法的调用需要对象的支持,那么在方法中如何获取对象的属性呢?this!this关键字我们已经很熟悉了,在js方法中,我们可以用this来取得对方法调用者(对象)的引用,从而获取方法调用者的各种属性。
JS代码:(见附件test6.html)
var obj = {"name":"NAME","sex":"female"};
//为对象添加方法
obj.print = function(){
alert(this.name + "_" + this["sex"]);
};
//NAME_female
obj.print();
obj.sex = "male";
//NAME_male
obj.print();
下面来一个更加面向对象的例子:
JS代码:(见附件test7.html)
var person = {
name:"defaultname",
setName:function(s){
this.name = s;
},
"printName":function(){
alert(this.name);
}
};
//defaultname
person.printName();
person.setName("newName");
//newName
person.printName();
在上面的例子中,完全可以用person.name = …来直接改变person的name属性。另一种改变person属性的方法就是:定义一个function,接收两个参数,一个是person,一个是name的值,看起来像是这样:changeName()person,”newName”),哪种方法好呢?很明显,例子中的方法更形象,更直观一些,而且好象有了那么一点面向对象的影子。