JavaScript中函数本身就是对象。函数在JavaScript中可以:
1、被赋值给一个变量;
2、被赋值给对象的属性;
3、作为参数被传入别的函数;
4、作为函数的结果被返回;
5、用字面量来创建;
//1、比较少用的函数定义方式
var a=new Function("x","y","return(x+y)");
alert(a(1,2));
//2、另外两种定义方式
function add(x,y)
{
<span style="white-space:pre"> </span>return x+y;
}
var add=function(x,y)
{
<span style="white-space:pre"> </span>return x+y;
}
//3、函数作为对象使用
function p()
{
<span style="white-space:pre"> </span>alert("invoke...");<span style="white-space:pre"> </span>
}
p.id="func";
p.type="function";
alert(p);
alert(p.id+":"+p.type);
alert(p());
函数的参数,在调用时可以传入超出形参数量的参数,其是通过arguments这个伪数组来实现的。
函数的作用域,JavaScript中的变量作用域为函数体内有效,而无块作用域。JavaScript的作用域为词法作用域,也就是说其在定义时(词法分析时)就已经确定,而非在执行
时。
//4、函数作用域
var str="global";
function scopeTest()
{
alert(str);
var str="local";
alert(str);
}
scopeTest();
//此函数的实际结果为:
undefined
local
输出以上结果的原因是:在词法分析结束后,构造作用域链的时候,会将函数内部定义的var变量放入该链,因此str在整个函数scopeTest内都是可见的(从函数体的第一行到
最后一行),由于str变量本身是未定义的,程序顺序执行,到第一行就会返回未定义,第二行为str赋值,所以第三行打印“local”。
call和apply
call和apply通常用来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。举例如下:
//call和apply的使用
//定义一个人,名字叫jake
var jake={
name:"jake",
age:26
};
//定义另外一个人,名字叫Java
var Java={
name:"Java",
age:100
};
//定义一个全局的函数对象
function printName()
{
return this.name;
}
function setValue(name,age)
{
this.name=name;
this.age=age;
}
//设置printName的上下文为jake,此时的this为jake
alert(printName.call(jake));
//设置printName的上下文为Jave,此时的this为Jave
alert(printName.call(Java));
//使用apply方法
alert(printName.apply(jake));
alert(printName.apply(Java));
//注意:当只有第一个对象参数时,call和apply的用法是一样的,但是如果加上后面参数就不一样了,如下例:
setValue.apply(jake,['abc','123']);//第二个参数是个数组
alert(printName.apply(jake));
setValue.call(Java,"ddd","ssss");;//而call则需要跟多个参数
alert(printName.call(Java));
注意:apply的第二个参数为:一个函数需要的参数组成的数组,而call则需要跟若干个参数,参数之间以逗号分隔即可。