首页 > 技术文章 > JavaScript高级程序设计(第三版)第七章 函数表达式

fashion1993 2014-10-14 22:27 原文

一种是函数声明;另一种是函数表达式。

函数声明提升:

say Hi();

function say Hi(){

  alert("Hi!");

}      //这个例子不会抛出错误,因为在代码执行之前会先读取函数声明。

匿名函数:var functionName=function(arg0,arg1,arg2){函数体};

sayHi();   //错误:函数还不存在

var sayHi=function(){

  alert("Hi!");

};

 


 

//不要这样做                                                   //可以这样

if(condition){                                                var sayHi();

  function sayHi(){             if(condition){

    alert("Hi!");                sayHi=function(){

  }else{                      alert("Hi!");

    alert("Yo!");                };

  }                      }else{

}                           alert("Yo!");

                          };

                        }

 

7.1 递归

            function factorial(num){
                if (num <= 1){
                    return 1;
                } else {
                    return num * factorial(num-1);             //return num * arguments.callee(num-1);这是正确的
                }
            }

            var anotherFactorial = factorial;
            factorial = null;
            alert(anotherFactorial(4));  //error!

 

 

7.2 闭包

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

function fn(propertyName){

         return function(object1){

                   var v1 = object1[propertyName]; //访问了外部变量propertyName变量

         }

}

 

7.2.1 闭包与变量

function createFunctions(){

         var result = [];

         for(var i=0; i<10; i++){

                   result[i] = function(num){

                            return function(){

                                     return num;

                            }

                   }(i);

         }

}

var funcs = createFunctions();

for(var i=0; i<funcs.length; i++){

         document.write(funcs[i] + ‘<br />’); //output 0,1,2,3…9

}

 

7.2.2 this对象

如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

function assignHandler(){

         var element = document.getElementById(‘someElement’);

         var id = element.id;

         element.onclick = function(){

                   alert(id);

         };

 

         element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

}

7.2.3 内存泄漏

如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

function assignHandler(){

         var element = document.getElementById(‘someElement’);

         var id = element.id;

         element.onclick = function(){

                   alert(id);

         };

 

         element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

}

 

推荐阅读