今天又把javascript函数部分复习了一下,把一些难点归纳下,为了让书越看越薄,还是决定记下来。
1. 创建函数的2种方式:函数声明和函数表达式:
二者的区别:函数声明提升。函数声明后面不能跟圆括号,但函数表达式后面可以跟圆括号。要将函数声明转化为函数表达式,只需在给函数声明加一对圆括号即可。(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。可通过下面的方法。
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就会指向其他对象)。
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从来不会告诉你是否多次声明了同一个变量:遇到上述情况,它只会对后续声明视而不见(不过,它会执行后续声明中的变量初始化)。匿名函数可以用来模仿块级作用域并避免这个问题。
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));
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。