13.8.5 函数的实例属性和类属性
JavaScirp函数不仅仅是一个函数,而且是一个雷。根据函数中声明变量的方式,函数中的变量有3中。
局部变量:在函数中以普通方式声明的变量。
实例属性:在函数中以this前缀修饰的变量。
类属性:在函数中以函数名前缀修饰的变量。
13.8.6 调用函数的3中方式
定义一个函数之后,JavaScript提供了3中调用函数的方式。
直接调用函数
//调用window对象的alert方法
window.alert("测试代码");
以call()方法调用函数
直接调用函数的方式简单、易用,但这种调用方式不够灵活。有些时候调用函数时需要动态的传入一个函数引用,
此时为了动态地调用函数,就需要使用call方法来调用函数了。
代码示范:
var each = function(array,fn)
{
for(var index in array)
{
//以window为调用者来调用fn函数
//index、array[index]是传给fn函数的参数
fn.call(null,index,array[index]);
}
}
//调用each函数,第一个参数是数组,第二个参数是函数
each([4,20,3],function(index),ele)
{
document.writeln("第"+index+"个元素是:"+ele);
}
以apply()方法调用函数
apply()方法与call()方法的功能基本相似,他们都可以动态地调用函数。
apply()与call()的区别如下:
通过call()调用函数时,必须在括号中详细地列出每个参数。
通过apply()动态地调用函数时,可以在括号中以arguments来代表所有参数。
代码示范:
var myfun = function(a,b)
{
alert("a的值是:"+a+"/nb的值是:"+b);
}
var example = function(num1,num2)
{
//直接用arguments代表调用example函数时传入的所有参数
myfun.apply(this.arguments);
}
//为apply()动态调用传入数组
myfun.apply(window,[12,23]);
example(20,40);
13.8.7 函数的独立性
虽然定义函数时可以将函数定义成某个类的方法,或定义成某个对象的方法。但JavaScript的函数时"一等共鸣",它永远是独立的,
函数永远不会从属于其他类、对象。
代码示范:
function Dog(name,age,bark)
{
this.name = name;
this.age = age;
this.bark = bark;
this.info = function()
{
return this.name+"的年龄为:"+this.age+",它的叫声是:"+this.bark;
}
}
//创建Dog的实例
var dog = new Dog("旺财",3,"汪汪");
//创建Cat函数,对应Cat类
function Cat(name,age)
{
this.name = name;
this.age = age;
}
//创建Cat实例
var cat = new Cat("kitty",2);
//将dog实例的info方法分离出来,在通过call方法来调用info方法。
//此时以cat为调用者
alert(dog.info.call(cat));
输出结果为:kitty的年纪为:2,它的叫声:undefined。
上面程序函数Dog定义了名为info()的实例方法,但这个info()方法并不完全属于Dog实例,它依然是一个独立函数,所有程序在最后一行代码
处将该函数分离出来,并让Cat实例来调用这个info()方法。
13.9 函数的参数处理
大部分时候,函数都需要接受参数传递。JavaSript的参数全部是采用值传递方式。
13.9.1 基本类型和复合类型的参数传递
对于基本类型参数,JavaScript采用值传递方式,因此在函数中修改参数值并不会对实参有任何影响。
基本类型参数代码示范:
function change(num)
{
num=5;
document.write("函数里的num="+num);
}
var num = 1;
change(num);
document.write("传入函数的num为"+num);
复合类型参数代码示范:
function change(person)
{
person.age = 10;
document.writeln("函数执行中person的age值为:"+person.age);
}
//使用json语法定义person对象
var person = {age:5};
document.writeln("函数调用前的person的age的值为:"+person.age);
change(person);
document.writeln("函数调用后的person的age的值为:"+person.age);
结果为:函数调用前的person的age的值为:5
函数执行值的person的age值为:10
函数调用后的person的age的值为:10
13.9.2 空参数
在JavaScript的函数中会将没有传入实参的参数值自动设置为undefined值。
代码示范:
function changeAge(person)
{
if(typeof person ==‘object‘)
{
document.write(person.age);
}
else
{
alert("参数类型不符合:"+typeof person);
}
}
输出结果为:参数类型不符合:undefined。
由于JavaScript调用函数时对传入的实参并没有要求,因此JavaScript没有所谓的函数“重载”,如果先后定义两个同名的函数,
它们的形参列表并不相同,这也不是函数重载,这种方式会导致后面定义的函数覆盖前面定义的函数。
代码示范:
function test()
{
alert("第一个无惨的test函数");
}
function test(name)
{
alert("第二个有参的函数");
}
test();
输出结果始终未第二个test函数。
13.9.3 参数类型
JavaScript函数声明的参数列表无须类型声明,这是它作为一个弱类型语言的特征。
代码示范:
//name可以为任意类型 但在函数里面是不需要声明传入的name是什么类型。
function test(name)
{
}
8月3号=》331页-340页