玩js自然要和函数打交到。函数嘛简单来说就是给代码分个块,方便调用、信息隐藏和代码复用,还可以用于指定对象的行为。另外函数还可以玩出很多花样来。。。
JavaScript 使用关键字 function定义函数。
定义一个函数:
//函数声明
//这种定义函数的好处是可以在当前作用域内任何位置调用,因为变量的声明和函数的声明都会被提升到当前作用域前面去执行。
function $id(id,fa){
fa=fa || document;
return document.getElementById(id);
}
//函数表达式
//这种方式其实就是定义了一个匿名函数(函数没有名称),然后把这个函数赋值给了一个变量,通常通过变量名来调用。
//这种方式只能在赋值给变量之后才能通过变量名调用。这就和我们平时声明变量和给变量赋值一个道理。
var $id=function(id,fa){
fa=fa || document;
return document.getElementById(id);
};
//构造函数
//这种方式我们一般没怎么用,如果要用这种方式,我们可以使用函数表达式代替
var $id=new Function('id','fa','fa=fa || document;return document.getElementById(id);');
函数的参数:
/*
如果是Java语言,方法规定的参数是多少,就必须传多少,如果参数不一样,需要用到方法重载。但是js里面是没有方法重载的。
我们可以给函数传递任意多个参数,前提是你确定传这些参数你的函数都能正确处理。
而且我们在函数内获取传递进来的参数也可以通过一个arguments的对象来获取到传递进来的参数,
arguments对象不能显式创建,arguments对象只有函数开始时才可用。
函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。
索引 n 实际上是 arguments 对象的 0…n 属性的其中一个参数。
除了参数意外,arguments还有一个callee属性,callee属性,返回正被执行的 Function 对象,
也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,
仅当相关函数正在执行时才可用。callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的递归函数。
*/
function calleeTest(){
console.log(arguments[0]);
arguments[0] +=1;
if(arguments[0]<10){
arguments.callee(arguments[0]);
}
}
calleeTest(1);//1;2;3;4;5;6;7;8;9
函数的调用:
//函数名加()就可以调用函数,这也是最常用的调用方式,()里面可以传我们需要的参数,如果传的个数比需要的少,
//那么方法里面多的参数就是undefined;如果传的参数数量比定义函数时规定的参数多,
//那么可以在函数内通过arguments访问到多余的参数。
$id('swfsocketdiv');
//在普通的函数调用方式中,函数的调用上下文(this的值),
//为全局对象(非严格模式)或者undefined(严格模式)。
function test(){
console.log(this);
function m(){
console.log(this);
}
m();
}
test();//Window;Window;
//如果当前函数是一个匿名函数,还可以用自调用的方式调用,
(function(){
console.log(this);
})()
//返回:Window对象,这种方式其实也算是普通的调用方式吧,只是看起来似乎不一样
//函数定义作为对象的属性,称之为对象方法。作为方法调用中,
//this指向当前对象。利用这一特性,我们可以在方法不需要明确的返回值时,直接返回this,从而实现"方法链"。
//函数内部如果还有函数,嵌套函数不会继承外层函数的this
var Selector={
test:function(id,fa){
console.log(this);
function m(){
console.log(this);
}
m();
}
}
Selector.test();//Object { test: Selector.test() };Window;
//函数如果用于创建新的对象,称之为对象的构造函数。
function Student(name){
this.sname=name;
console.log(this);
}
//创建一个对象student
var student=new Student('ly');//Object { sname: "ly" }
//创建一个对象student2
var student2=new Student('lyong');//Object { sname: "lyong" }
//call,apply调用,如果某个对象有一个方法,而我在另一个对象中需要用到这么一个方法,
//但是我又不想在另一个对象中再重复一次这个方法,那么这时就可以使用call或者apply切换函数所处的上下文环境
function callMe(cname){
this.cname=cname;
}
var cm=new callMe('testname');
Student.call(cm);//Object { cname: "testname", sname: undefined }
Student.call(cm,'test');//Object { cname: "testname", sname: "test" }
Student.apply(cm);//Object { cname: "testname", sname: undefined }
Student.apply(cm,['test']);//Object { cname: "testname", sname: "test" }
至于函数的返回值,如果有则返回,没有返回undefined,和其他语言差别不大。