JavaScript内核笔记03-函数

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则需要跟若干个参数,参数之间以逗号分隔即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值