今天又把javascript函数部分复习了一下,把一些难点概括下,为了让书越看越薄,仍是决定记下来。javascript
1. 建立函数的2种方式:函数声明和函数表达式:java
两者的区别:函数声明提高。函数声明后面不能跟圆括号,但函数表达式后面能够跟圆括号。要将函数声明转化为函数表达式,只需在给函数声明加一对圆括号便可。(function(){})();
函数声明:重要特征:函数声明提高,在执行代码前先读取函数声明,因此能够把函数声明放在调用它的语句后面。面试
sayHi(); function sayHi(){ alert('hi'); } //不会报错
函数表达式在使用前必须先赋值。不然会报错。数组
sayHi(); Var sayHi=function{ alert('hi'); } //会报错
2.递归:arguments.callee是一个指向正在执行的函数的指针。闭包
function factorial(num){ if(num<=1){ return 1; }else{ return num * arguments.callee(num-1); } }
可是在严格模式下,不能经过脚本访问arguments.callee。可经过下面的方法。app
var factorial=(function f(num){ if(num<=1){ return 1; }else{ return num * f(num-1); } });
3.this对象:函数
this对象是在运行时基于函数的执行环境绑定的:在全局函数中this等于window,而在函数被看成某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具备全局性,所以其this对象一般指向window(固然,在经过call()或apply()改变函数执行环境的状况下,this就会指向其余对象)。this
var name="the window"; var obj={ name:"My object", getNameFun:function(){ return function(){ return this.name; } } } alert(obj.getNameFun()()); //the window
4.屡次声明同一个变量:指针
function outputNumber(){ for(var i=0;i<10;i++){ console.log(i); //1 2 3 4 5 6 7 8 9 } var i; console.log(i); //10 }
javascript历来不会告诉你是否屡次声明了同一个变量:遇到上述状况,它只会对后续声明视而不见(不过,它会执行后续声明中的变量初始化)。匿名函数能够用来模仿块级做用域并避免这个问题。code
5.闭包与变量:
因为做用域链的机制,闭包只能取得包含函数中任何变量的最后一个值。是由于闭包所保存的是整个变量对象,而不是某个特殊的变量。
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(){ return i; } } alert(result[2]()); //10 return result; }
result是一个函数数组,此时每一个函数都引用着保存变量i的同一个变量对象,因此在每一个函数内部i的值都是10. 可是能够经过让函数当即执行,来符合咱们的预期。
function createFunction(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(num){ return num; }(i) } alert(result);//0,1,2,3,4,5,6,7,8,9 return result; }
因为函数参数是按值传递的,因此会将变量i的当前值复制给参数num,这样,result数组中的每一个函数都有本身num变量的一个副本,所以就能够返回各自不一样的数值了。
6.返回一个函数:
function createCompareFunction(pro){ return function(obj1,obj2){ var va1=obj1[pro]; var va2=obj2[pro]; if(va1<va2){ return -1; }else if(va1>va2){ return 1; }else{ return 0; } }; } var compare=createCompareFunction('name');//建立函数 alert(compare({name:'wsz'},{name:'hh'}));//调用函数
7.一道面试题:
var add=function(x){ var sum=1; var tmp=function(x){ sum=sum+x; return tmp; } tmp.toString=function(){ return sum; } return tmp; } alert(add(1)(2)(3));