然后到函数了,函数的话就是用function来定义,可以用在函数定义表达式(var f=function(arg,arg2,...){...})或者函数声明表达式(function funcname(arg,arg2,...){...})语句里。大多数函数中都会有return语句,可以导致函数停止执行,并返回后面的表达式的值,如果没有return函数就执行完每条语句后返回undefined值给调用者。下面有3个表达式写法的例子:
//最常见的写法 function f(){ var a="1"; return a; } f(); //定义表达式写法 var f=function(){ var a="1"; return a; } console.log(f()); //这个。。。算是简化过的表达式写法 console.log((function f(){ var a="1"; return a; })());
除了上面的定义还能用Function()构造函数来定义:var f=new Function("x","y","return x+y;")这个等价于var f=function(x,y){return x+y;},不过Function()构造函数一般不太用,不用去太纠结这个东西。
在函数调用上,除了最简单的调用外,还可以在对象中调用方法,方法也就是在对象中的函数,比如下面这样:
var c={ a:1, b:1, add:function(){ var self=this; console.log((function f(){ return self.result=self.a+self.b; //在嵌套函数里面用this是全局对象或者undefined,所以要用上面的self保存this })()); //输出5 return this.result=this.a+this.b; } }; c.a=2; c.b=3; c.add(); console.log(c.result); //输出5
上面的例子中,函数体使用this来引用该对象。嵌套的函数不会从调用它的函数中继承this,如果是方法调用,this就是指调用对象,若是函数调用,就是全局对象或者undefined。如果要在嵌套函数中调用外部函数的this值,就可以向上面例子一样。this的详细用法还可以看看这个:详解JavaScript中的this
在函数的参数中,当调用的函数的参数比形参少的时候,剩下的多的形参都是undefined,因此在写代码的时候还是要用/*optional*/标示一下哪些形参是可选的。
var f=function(a,/*optional*/b){ // /**/中间的注释来强调形参是可选的 if(b==undefined) b=a; console.log(b); //4 return a+b; }; console.log(f(4)); //8
当调用函数的参数比形参多的时候,多余的参数可以用arguments[i]来得到,就比如下面的例子:
var f=function(a){ if(arguments.length!=1){ for(var i=0;i<arguments.length;i++){ console.log(arguments[i]); //1 2 3 4 } } console.log(a); //1 }; f(1,2,3,4);
在函数中还有一个东西要学,那就是闭包,闭包是什么呢?解释很长很抽象, 我觉得它就是一个函数中的函数(好吧这是废话),它是函数的局部变量,它在函数return掉后,它不会被释放掉。可以通过下面的例子来理解闭包:
var i=10 function a(){ var i=5; function b(){ console.log(++i); //i本来从函数外部访问不到,用了闭包就可以变相的访问 } return b; } var c=a(); //c执行了a函数 c就是a的返回值 c(); //6 这里的c执行的是b函数 调用的是闭包内部的i c(); //7 第一次的执行c()后,a中的i值依旧保存 不会被释放 console.log(i); //10 调用的是闭包外面的那个值
在参数的传递中,还可以通过下面那个例子一样来传递参数,应该也算是闭包的一种应用吧:
var f=(function(a){ return function(b){return a+b;}; })(3); //a是3 console.log(f(5)); //把5穿入b中,这样结果是8
函数差不多就这点基础的东西吧,等有撒好东西再补充。