玩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,从而实现"方法链"。//函数内部如果还有函数,嵌套函数不会继承外层函数的thisvar 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);}//创建一个对象studentvar student=new Student('ly');//Object { sname: "ly" }//创建一个对象student2var 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,和其他语言差别不大。