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